我不会说俄语,所以我在验证月份拼写是否正确等方面遇到了困难.老实说,我不完全确定我的输入是俄语(俄语是谷歌翻译检测到的语言)

我用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.


EDIT:为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

推荐答案

由于您要解析用户输入,我认为,唯一的 Select 是在解析输入之前将其标准化--在那里不能诉诸标准.

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

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

在此基础上,并考虑到可能的用户错误、打字错误、常识和编程习惯,您可能会在野外遇到以下月份名称的"简短所有格形式":

  • 1月:янв,янв.
  • 2月:февфеврфев.февр.
  • 三月:мар,марта,мар.,март.
  • 4月:апр,апр.
  • 五月:мая,мая.
  • 6月:июниюняиюн.
  • 7月:июлиюляиюл.
  • 8月:авг,авг.
  • 9月:сенсентсен.сент.
  • 10月:окт,окт.
  • 11月:нояноябноя.нояб.
  • 12月:дек,дек.

Java相关问答推荐

RDX触发ChoiceBox转换器(并按字符串值排序)

在URL类图中表示Java swing类

具有额外列的Hibert多对多关系在添加关系时返回NonUniqueHealthExcellent

了解Android Studio中的调试器输出

缩小画布比例后更改滚动窗格的内部大小

流迭代列表<;对象>;上的NoSuchElementException

所有 case 一起输入时输出错误,而单独放置时输出正确

为什么一个Test的instance?& gt;在构造函数中接受非空对象?

Spark上下文在向Spark提交数据集时具有内容,但Spark在实际构建它时发现它为空

Spark忽略Iceberg Nessie目录

如何从Keyloak映射Hibernate实体中的用户

每次FXMLLoader调用ApplationConext.getBean(类)时创建@Component的新实例

如何在JavaFX循环中完美地制作一个AudioClip/MediaPlayer?

错误:不兼容的类型:Double不能转换为Float

如何使用WebEnvironment.RANDOM_PORT获得第二个随机端口?

Java中的发布/订阅-Long Live和Short Live Publisher,哪种方法是正确的?

如何使用Java对随机生成的字母数字优惠券代码进行过期设置

在Spring Boot中使用咖啡因进行缓存

当我将JTextField的getText函数与相等的String进行比较时;t返回true

java构造函数中的冻结操作何时发生?