当前位置: 首页 > 面试题库 >

SimpleDateFormat toPattern在Java 9中的行为有所不同

拓拔嘉运
2023-03-14
问题内容
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, new Locale("SV", "SE"));
((SimpleDateFormat) dateFormat).toPattern();

在Java 8中,此行产生,"yyyy-MM-dd"而在Java 9中,它产生"y-MM-dd"

这对于我们的遗留代码有一些严重的问题,是否有某种方法可以还原行为?


问题答案:
    System.setProperty("java.locale.providers", "COMPAT,CLDR");
    DateFormat dateFormat
            = DateFormat.getDateInstance(DateFormat.SHORT, new Locale("sv", "SE"));
    System.out.println(((SimpleDateFormat) dateFormat).toPattern());

在我的jdk-9.0.4上运行此打印

yyyy-MM-dd

您可能想-D在命令行上使用属性设置,它不会有任何区别。

在Java
9中,来自Unicode联盟的通用语言环境数据存储库(CLDR)被用作语言环境数据的默认源,而在早期的Java版本中则不是这种情况。如上所述设置系统属性将启用Java
8行为。正如nullpointer在评论中所说,您可以在此处阅读更多内容:默认情况下使用CLDR Locale
Data


罗勒·布尔克(Basil Bourque)的评论是正确的,习惯上将小写缩写用于语言,因此您可能应该指定sv以确保不会混淆读者。

可能还会想知道y模式中是否有一个或四个是否有任何区别。我阅读SimpleDateFormat文档的方式是,y将按照80-20规则来解释两位数的年份:它是在过去80年内或在接下来的20年之内。yyyy将两位数字的年份解释为公元一世纪的一年。
。假设您的年份在4位数范围(1000到9999)之间,那么我认为这不是问题。

如果这仅适用于瑞典语言环境,则该代码的现代版本将给出相同的结果:

DateTimeFormatterBuilder.getLocalizedDateTimePattern(
        FormatStyle.SHORT, null, IsoChronology.INSTANCE, new Locale("SV", "SE")));

然而,对于一些语言环境(en- CY塞浦路斯例如,英语)的结果不同DateFormatDateTimeFormatter,所以如果你的目标是最大的向后兼容性,坚持使用过时的DateFormat类。



 类似资料:
  • 问题内容: 此代码在Java 6和Java 7中产生不同的输出。在Java 6中,条件返回,在Java 7中,返回。为什么? 为什么该程序在Java 6和Java 7中产生不同的输出? 问题答案: 似乎JDK7处理实习生的方式与以前不同。 我用版本1.7.0-b147进行了测试,结果“都是相等的”,但是用1,6.0_24执行它(相同的字节码)时,我没有得到消息。 它还取决于该行在源代码中的位置。以

  • 问题内容: 不知道为什么会这样。。。一直在谷歌搜索,但我似乎找不到答案。我有2个Mac,在每个Mac上都有一个包含相同package.json文件的文件夹,其中包含20个依赖项的列表。当我在…上运行“ npm install”时 计算机1: 将所有列出的依赖项安装在自己的文件夹中-总共20个文件夹。 计算机2: 安装了大量不同的文件夹-确切地说是561。这些额外的文件夹似乎是我在package.j

  • 问题内容: 在Angular1.x中,有时我需要发出多个请求并对所有响应进行处理。我将所有的承诺都放在一个数组中并调用。 Angular 2最佳实践似乎指向使用RxJS 代替请求中的Promise。如果我从http请求创建了两个或多个不同的Observable,那么是否有等效于的? 问题答案: 模拟的更直接替代方法是使用运算符(它并行启动所有可观察对象并加入其最后一个元素): 文件资料 有点超出范

  • 问题内容: 我正在编写一些db实用程序脚本,我需要做的任务之一是仅重建数据,而保持架构不变。使用bash和mysql工具(无php等)从命令行自动执行此操作的最简单方法是什么? 更新:我希望该解决方案可以在一个命令中处理所有表,并且如果可能的话,如果添加或删除了表,则不需要更新。 问题答案: 这将清空表的内容。 响应Q编辑:从我的快速测试中看来,您将必须至少执行2个查询,因为似乎“显示表”不能用作

  • 使用Java-9Build9-EA+149和JOL0.6。 但不知道它应该是什么样子。

  • 问题内容: 我正在将代码从Java(1.6)手动转换为C#,并发现原语(int和double)的行为有些困难。在C#中,似乎几乎所有转换都是自动发生的 但是在Java中,只允许其中一些 对于系统分析差异和任何基本原理,我将不胜感激。 问题答案: 在您的C#示例中,没有装箱或拆箱(和自动装箱)操作。 只是的别名 。 在Java中,装箱是必需的。因为类型擦除,你不能创建,只。在编译时,将变成,并且需要