如何识别日期格式?

时间:2019-09-03 18:33:15

标签: java date calendar

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中看到哪种格式?

2 个答案:

答案 0 :(得分:4)

日期对象没有“格式”

  

如何识别日期格式?

日期时间对象没有“格式”。每个类都定义了自己的内部存储日期时间值的机制。该机制通常与我们无关。该类的API,即该类做出的承诺就很重要。

您可能正在将日期时间对象生成的文本与日期时间对象本身进行混淆。日期时间类可以将文本解析为实例化的一部分。日期时间类可以生成文本来表示其值。但是文本和对象是分开的和不同的。

避免使用Calendar

  

如果我打印出日历对象,则会得到:

Calendar::toString方法只是其许多内部字段的数据转储。显然,它仅用于调试,否则无济于事。

Calendar类及其常用的子类GregorianCalendar现在都为legacy。自从采用JSR 310以来, java.time 类已在几年前取代了它们。永远不要使用它们。 GregorianCalendarZonedDateTime专门取代。

避免使用Date

  

如果我打印出一个Date对象,我将得到:

Date::toString方法位于。该方法在生成文本时动态地应用JVM当前的默认时区。 java.util.Date实际上代表UTC的时刻,而不是toString结果中看到的时区。这种反功能是永远不要使用Date的众多原因之一。

java.util.Date类被java.time.Instant取代,它也代表UTC的一个时刻,但是分辨率要比纳秒和毫秒更细。

ISO 8601

  

但是我正在检查生成的XML,并且观察到这种格式:

     

2014-02-28T08:00:00.000Z

该文本的格式在ISO 8601标准中定义。明智地设计了该标准,以文本方式表示各种日期时间值以进行数据交换。该标准取代了早期定义不明确的日期时间文本格式,例如早期电子邮件协议中所见。

java.time 类在解析/生成字符串时默认使用ISO 8601格式。

UTC当前时刻

要使用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中的日期时间类型

Table of date-time types in Java (both legacy and modern) and in standard SQL.


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 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)?