我不会说俄语,所以我无法验证月份是否拼写正确等。说实话,我不能完全确定我的输入是俄语(俄语是 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/