java - Kotlin/Java/JVM - 解析俄罗斯日期,如 "28 фев. 2019"

标签 java kotlin date parsing internationalization

我不会说俄语,所以我无法验证月份是否拼写正确等。说实话,我不能完全确定我的输入是俄语(俄语是 Google 检测到的语言)翻译)

我在 Kotlin 中有一些代码,它尽力解析以各种格式和语言指定的日期。然而,我正在努力解析俄罗斯日期。这是我的代码的相关部分:

sequenceOf(
  "ru-RU", // Russian
  "sr", // Serbian
).forEach {
  val format = DateTimeFormatter.ofPattern("d MMM. yyyy")
    .withLocale(Locale.forLanguageTag(it))
  try {
    return listOf(LocalDate.parse(dateString, format))
  } catch (e: Exception) {
    //Ignore and move on
  }
}

此代码正确解析 "27 апр. 2018""24 мая. 2013",但解析 "28 фев. 2019" 失败>.

"28 фев. 2019" 有什么特别之处和/或如何正确解析该值?

如果您用 Java 提供答案,我可以相当轻松地将其翻译为 Kotlin。


编辑:这是 Kotlin 中的 SSCCE:

import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.util.*

println("System.getProperty - " + System.getProperty("java.version"));
println("Runtime.version - " + Runtime.version());

val dateString = "28 фев. 2019"

sequenceOf(
    "ru-RU", // Russian
    "sr", // Serbian
).forEach {
    val format = DateTimeFormatter.ofPattern("d MMM. yyyy")
        .withLocale(Locale.forLanguageTag(it))
    try {
        println("Parse successful - " + LocalDate.parse(dateString, format))
    } catch (e: Exception) {
        println("Parse failed - " + e)
    }
}

我的系统上的输出:

System.getProperty - 17.0.4.1
Runtime.version - 17.0.4.1+7-b469.62
Parse failed - java.time.format.DateTimeParseException: Text '28 фев. 2019' could not be parsed at index 3
Parse failed - java.time.format.DateTimeParseException: Text '28 фев. 2019' could not be parsed at index 3

最佳答案

由于您正在解析用户输入,我相信唯一的选择是在解析输入之前对其进行标准化 - 吸引标准不是一个选项。

在俄语中,我们在日期中使用月份名称的属格形式(Java DateTimeFormat 中的 M(M)+L(L)+),并且通常很短表单是使用以下规则生成的(请不要将其与编程标准、约定、习惯、技巧、UI/UX 指南等混淆):

  • .(点)表示单词的缩写形式 (мая.мая - 第一种形式看起来很荒谬,因为 маяMay 的完整属格形式,另一种情况:июн.июня - 两者长度相同,但 июняJune 的完整属格形式)
  • 通常,如果连续辅音后面跟着完整形式的元音,则应保留它们(双辅音有一些异常(exception)) - 似乎是您的情况:фев.февр.
  • 缩写形式不应以元音、йьъ 结尾

基于此,并考虑到可能的用户错误、拼写错误、常识和编程习惯,您可能会遇到以下月份名称的“短属格形式”:

  • 一月:янвянв。
  • 二月:февфеврфев.февр.
  • 三月:мармартамар.март.
  • 四月:апрапр。
  • 五月:маямая。
  • 六月:июниюняиюн.
  • 七月:июлиюляиюл.
  • 八月:авгавг。
  • 九月:сенсентсен.сент.
  • 十月:октокт。
  • 11 月:нояноябноя.нояб.
  • 十二月:декдек。

关于java - Kotlin/Java/JVM - 解析俄罗斯日期,如 "28 фев. 2019",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74439102/

相关文章:

java - 为什么 TomEE 无法创建 JMS 连接工厂资源?

android - 在 Kotlin for Android 中触发接口(interface)

android - RxJava 如何从订阅创建 Observable

sql - SSMS - MYSQL Server 查询选项设置为开/关以短日期格式显示所有列?

java - 为什么我的日期显示不正确?

java - solr空间性能差

java - Gradle 不在命令行上执行任何测试

java - java应用程序之间的快速对象共享

android - onRetainCustomNonConfigurationInstance 在 AndroidX 中已弃用

javascript - 在javascript中将错误的ISO格式解析为一个好的日期