gpt4 book ai didi

java - Formatter VS DateFormat 不一致

转载 作者:行者123 更新时间:2023-11-30 10:35:58 25 4
gpt4 key购买 nike

前提

这个问题可能被合理地认为过于宽泛或观点驱动,但我觉得无论如何我都必须冒险。

问题

在 Java 的 Formatter 中说明的日期/时间转换格式之间存在许多难以理解的不一致之处。 VS SimpleDateFormat蜜蜂。

例如:

  • M代表 Formatter 中的分钟但是 SimpleDateFormat 中的月份反之亦然
  • SL Formatter中分别代表秒和毫秒,但是sS SimpleDateFormat中分别代表秒和毫秒
  • Aa分别代表Formatter中星期几的长/短名称但 SimpleDateFormat 中的输出相同由 <= 2 表示对比> 2连续出现 E , 而 a代表 AM/PM 标记,在 SimpleDateFormat

问题(s)

  • 是否有一些合理的理由来证明这些不一致,例如也许这两个类(class)使用不同的标准?
  • 我只能从 Formatter 推断的 API:

    The types are similar to but not completely identical to those defined by GNU date and POSIX strftime(3c).

  • SimpleDateFormat似乎甚至懒得提及其公约的基本原理
  • 这两个约定是否在设计上是武断的不一致的,或者是否存在我不知道的隐含标准来证明这些不一致?

最佳答案

简单日期格式

正如@Tunaki 所说,SimpleDateFormat 使用 Date Field Symbol Table 定义的模式字符(由 CLDRUnicode Common Locale Data Repository 标准化)。

该项目被许多公司广泛使用,例如谷歌、IBM、微软、苹果等,以实现广泛的语言环境数据标准存储库,以及软件国际化和本地化。这就是为什么一些日期/时间模式与来自不同编程语言的其他模式非常相似的原因。

另外,除了裁决 way we use date, time and time zone , 指定排序规则、键盘映射、数字、货币等标准非常重要。此外,它定义了当我们尝试解析日文日期时会发生什么,例如

为了理解这一点,我们必须说明 what means a "parsing" process :

  • A mapping between a point in time (UDate) and a set of calendar fields, which in turn depends on:
    • The rules of a particular calendar system (e.g. Gregorian, Buddhist, Chinese Lunar)
    • The time zone
  • A mapping between a set of calendar fields and a formatted textual representation, which depends on the fields selected for display, their display style, and the conventions of a particular locale.

因此,有必要知道 "MMMMdjmm" 的框架可能会针对不同的语言环境产生以下格式模式:

Locale | format pattern
------ | ---------------------
en_US | "MMMM d 'at' h:mm a"
es_ES | "d 'de' MMMM, H:mm"
ja_JP | "M月d日 H:mm"

格式化程序

Formatter“采用”不同格式化模式的原因是因为这个类应该是 printf 风格格式字符串的解释器,它非常接近 GNU date。和 POSIX strftime(3c)现实(如 official docs states )。

来自 GNU 文档:

The output of the date command is not always acceptable as a date string, not only because of the language problem, but also because there is no standard meaning for time zone items like 'IST'.

When using date to generate a date string intended to be parsed later, specify a date format that is independent of language and that does not use time zone items other than 'UTC' and 'Z'.

让我们来看一个使用 GNU 的简单日期/时间示例:

TZ=UTC0 date +'%Y-%m-%d %H:%M:%SZ'
// Output: 2004-03-01 00:21:42Z

注意 printf 风格以及 Formatter 类相同转换字符的使用。

但是,文档还说它们只是相似,而不是相同。这是因为 Java 为特定字段选择了一些灵 active ,例如 'z' 情况:

RFC 822 style numeric time zone offset from GMT, e.g. -0800. This value will be adjusted as necessary for Daylight Saving Time.

关于java - Formatter VS DateFormat 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40828087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com