我有一个字符串格式的日期和12/11/2017,我想检测日期属于哪个区域设置。例如,在美国,日期写为mm / dd / yyyy。因此,对于上述日期,我的程序应该输出美国语言环境。根据输入,应该有不同的区域设置。
我无法在任何其他讨论中找到此问题的解决方案。我想检测日期的区域设置,即以什么区域格式写入日期。我以美国为例。日期可以是任何语言环境格式,如英国,法国,德国等。
答案 0 :(得分:2)
我建议您迭代可能的语言环境(Locale.getAvailableLocales()或您希望能够检测的您自己的语言环境列表),对于每个使用DateTimeFormatter.ofLocalizedDate()
的所有可能样式(full,long,中,短,或只是你认为相关的那些)并尝试将你的字符串解析为日期。如果成功,你有一个可能的语言环境,但只有几种可能。以下方法返回给定日期字符串的所有可能语言环境的数组。
public static Locale[] possibleLocalesForDateString(String dateString) {
Locale[] availableLocales = Locale.getAvailableLocales();
return Arrays.stream(availableLocales)
.filter(loc -> {
for (FormatStyle style : FormatStyle.values()) {
DateTimeFormatter formatter
= DateTimeFormatter.ofLocalizedDate(style).withLocale(loc);
try {
LocalDate.parse(dateString, formatter);
// succeeded; this is a possible locale
return true;
} catch (DateTimeParseException dtpe) {
// failed; ignore this locale/format style combination
}
}
return false;
})
.toArray(Locale[]::new);
}
在我的Java 8上possibleLocalesForDateString("12/11/2017")
返回一个包含50个语言环境的数组。从160个可用的语言环境开始,该方法已减少到不到三分之一的可能性。该数组不包含美国语言环境,因为短美国格式使用两位数年份,而中等格式类似Dec 11, 2017
。
其他结果:
12/11/17
提供多达67种可能的语言环境,包括US(en_US)和France(fr_FR)。该日期被理解为美国12月11日和法国11月12日。30/11/17
提供“仅”60个区域设置。美国不再包括在内,法国仍然是。使用大于12的日期有助于缩小可能性。12/31/17
仅提供包括美国在内的其余7个语言区域;但它仍然含糊不清。11.12.17
。我有30个语言环境,包括德国(de_DE)。 避免SimpleDateFormat
。由于您使用simpledateformat标记了您的问题,我想提一下SimpleDateFormat
类已经过时且非常麻烦。 java.time
,现代Java日期和时间API可以更好地使用。所以我在我的方法中使用该API的类和枚举。
链接:Oracle Tutorial on Date Time,其中解释了java.time
的使用。你可以在那里找到许多其他资源。
答案 1 :(得分:0)
没有。本地化的日期时间格式不明确。您12/11/2017
的示例可能是12月11日或11月12日。请参阅list of date format by country。
分离内容和演示文稿的问题。
2017-12-11
。幸运的是,java.time类在解析/生成字符串时默认使用标准格式。Locale
生成本地化字符串仅用于呈现给用户,绝不允许内部用作数据。请参阅DateTimeFormatter.ofLocalized…
方法。 java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。