1)如果我打印出日历对象,则会得到:
java.util.GregorianCalendar[time=1567535353679,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=8,WEEK_OF_YEAR=36,WEEK_OF_MONTH=1,DAY_OF_MONTH=3,DAY_OF_YEAR=246,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=6,HOUR_OF_DAY=18,MINUTE=29,SECOND=13,MILLISECOND=679,ZONE_OFFSET=0,DST_OFFSET=0]
2)如果我打印出一个Date对象,我将得到:
Tue Sep 03 18:29:13 GMT 2019
3)但是,我正在检查生成的XML,并且观察到这种格式:
2014-02-28T08:00:00.000Z
我在XML中看到哪种格式?
答案 0 :(得分:4)
如何识别日期格式?
日期时间对象没有“格式”。每个类都定义了自己的内部存储日期时间值的机制。该机制通常与我们无关。该类的API,即该类做出的承诺就很重要。
您可能正在将日期时间对象生成的文本与日期时间对象本身进行混淆。日期时间类可以将文本解析为实例化的一部分。日期时间类可以生成文本来表示其值。但是文本和对象是分开的和不同的。
Calendar
如果我打印出日历对象,则会得到:
Calendar::toString
方法只是其许多内部字段的数据转储。显然,它仅用于调试,否则无济于事。
Calendar
类及其常用的子类GregorianCalendar
现在都为legacy。自从采用JSR 310以来, java.time 类已在几年前取代了它们。永远不要使用它们。 GregorianCalendar
被ZonedDateTime
专门取代。
Date
如果我打印出一个Date对象,我将得到:
Date::toString
方法位于。该方法在生成文本时动态地应用JVM当前的默认时区。 java.util.Date
实际上代表UTC的时刻,而不是toString
结果中看到的时区。这种反功能是永远不要使用Date
的众多原因之一。
java.util.Date
类被java.time.Instant
取代,它也代表UTC的一个时刻,但是分辨率要比纳秒和毫秒更细。
但是我正在检查生成的XML,并且观察到这种格式:
2014-02-28T08:00:00.000Z
该文本的格式在ISO 8601标准中定义。明智地设计了该标准,以文本方式表示各种日期时间值以进行数据交换。该标准取代了早期定义不明确的日期时间文本格式,例如早期电子邮件协议中所见。
java.time 类在解析/生成字符串时默认使用ISO 8601格式。
要使用UTC捕获当前时刻,请使用Instant
。
Instant instant = Instant.now() ; // Capture the current moment in UTC.
以标准ISO 8601格式生成表示该值的文本。最后的Z
表示UTC,并发音为“ Zulu”。
2020-01-23T12:34:56.123456Z
解析这样的字符串。
Instant instant = Instant.parse( "2020-01-23T12:34:56.123456Z" );
在特定区域的人(一个时区)的墙上时钟中看到同一时刻。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
生成一种格式的字符串,该格式通过将时区的名称附加在方括号中来明智地扩展了ISO 8601标准。
String output = zdt.toString() ;
请参阅此code run live at IdeOne.com。
instant.toString():2020-01-23T12:34:56.123456Z
zdt.toString():2020-01-23T07:34:56.123456-05:00 [美国/蒙特利尔]
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:2)
我在XML中看到哪种格式?
XML格式受ISO 8601指定的XML schema documentation的启发。
3.2.7.1词法表示
dateTime 的·lexical space·由以下形式的有限长度的字符序列组成:
'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?