2016-11-27 73 views
3

前提格式化VS日期格式不一致

这个问题有可能被视为过于宽泛或意见驱动的,但我觉得我有反正冒这个险。

问题

有一个数在Java的Formatter VS SimpleDateFormat的API所示的日期/时间转换格式之间的不可理解的不一致。

例如:

  • M表示SimpleDateFormat反之亦然
  • SL分别表示第二和毫秒在Formatter,但sS分别表示Formatter微小但当月秒和毫秒SimpleDateFormat
  • Aa分别表示一天周的长/短名在Formatter但在SimpleDateFormat同一输出由<= 2 VS > 2E连续出现表示,而a表示AM/PM标记代替,在SimpleDateFormat
  • 等。

问题(S)

  • 有一些合理化justif对这些不一致,例如也许这两个班使用不同的标准?
  • 我只能从Formatter的API来推断:

    的类型类似于但不完全等同于那些由GNU日期和POSIX strftime(3c)定义。

  • SimpleDateFormat似乎并不理会,甚至提其约定
  • 的理由是这两项公约随心所欲不一致的设计,或者是我不知道的还有隐含的标准,即证明这些出现不一致?
+3

它非常类似于[Unicode标准](http://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table)。 ('SimpleDateFormat'在Java 1.0 IIRC中,于1996年发布,而这个标准更近了)。 'DateTimeFormatter'也匹配它的最新版本(尽管'DateTimeFormatter'不支持其中声明的某些模式)。 – Tunaki

+0

[java.time.format.DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)是Tunaki上面的注释中引用的类。 –

回答

1

的SimpleDateFormat

如@Tunaki所指出的,SimpleDateFormat使用由Date Field Symbol Table(其由CLDR标准化,或Unicode的通用语言环境数据存储库)定义的模式的字符。

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

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

为了理解这一点,我们必须规定what means a "parsing" process

  • 在时间(UDATE)上的点和一组日历字段,而这又取决于之间的映射:
    • 特定日历系统的规则(如公历,佛教,中国农历)
    • 时区
  • 一组日历字段与格式化文本表示之间的映射,这取决于选择显示的字段,其显示样式以及特定语言环境的约定。

所以,这是要知道的"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 datePOSIX strftime(3c)现实(作为official docs states)。

从GNU文档:

date命令的输出并不总是可以接受的日期 串,不仅是语言问题,因为,但也因为 存在时区没有标准意义像'IST'这样的项目。

当使用日期生成日后打算解析的日期字符串时, 指定与语言无关的日期格式,并且 不使用'UTC'和'Z'以外的时区项目。

让我们一起来看看与GNU一个简单的日期/时间例如:

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

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

但是,文档也表示它们只是相似的,而不是相同的。这是因为Java选择了一定的灵活性,针对特定领域,如在'z'情况:

RFC 822风格的数字时区从GMT,例如偏移-0800。这个 的值将根据夏令时的需要进行调整。