的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 date和POSIX 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。这个 的值将根据夏令时的需要进行调整。
它非常类似于[Unicode标准](http://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table)。 ('SimpleDateFormat'在Java 1.0 IIRC中,于1996年发布,而这个标准更近了)。 'DateTimeFormatter'也匹配它的最新版本(尽管'DateTimeFormatter'不支持其中声明的某些模式)。 – Tunaki
[java.time.format.DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)是Tunaki上面的注释中引用的类。 –