使用Java检测字符串格式的日期的区域设置

时间:2018-01-02 19:29:24

标签: java date simpledateformat java-date

我有一个字符串格式的日期和12/11/2017,我想检测日期属于哪个区域设置。例如,在美国,日期写为mm / dd / yyyy。因此,对于上述日期,我的程序应该输出美国语言环境。根据输入,应该有不同的区域设置。

我无法在任何其他讨论中找到此问题的解决方案。我想检测日期的区域设置,即以什么区域格式写入日期。我以美国为例。日期可以是任何语言环境格式,如英国,法国,德国等。

2 个答案:

答案 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

分离内容演示文稿的问题。

  • 内容
    • java.time
      在Java应用程序中,日期时间值应由java.time对象表示(避免使用旧的日期时间类)。
    • ISO 8601
      在将日期时间值序列化为文本以进行存储或交换时,请仅使用标准ISO 8601格式:2017-12-11。幸运的是,java.time类在解析/生成字符串时默认使用标准格式。
  • 介绍
    • 本地化
      使用Locale生成本地化字符串仅用于呈现给用户,绝不允许内部用作数据。请参阅DateTimeFormatter.ofLocalized…方法。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore