Jersey写了我的mysql时间戳为2011-09-28T21:48:25Z如何用Java格式化它?

我有一个mysql后端,它有一个时间戳字段,自动设置为currenttimestamp,如此( date_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP)。 在将值读为Date后, Jersey发送一个xml,其中时间戳显示为

 2011-09-28T21:48:25Z 

请不要做太多的背景故事:我无法改变从泽西岛获得的东西。 现在我的问题是这样的:我如何从xml解析2011-09-28T21:48:25Z作为Java理解的日期?

谢谢。

第一,

 DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") ; df.setTimeZone(TimeZone.getTimeZone("Zulu")) ; Date dd = df.parse("2011-09-28T21:48:25Z") ; 

……然后,可选地,

 Timestamp ts = new Timestamp(dd.getTime()) ; 

TL;博士

 Instant.parse( "2011-09-28T21:48:25Z" ) 

ISO 8601

您的输入字符串采用标准ISO 8601格式。

泽西岛是无关紧要的,除了它的设计师明智地选择使用ISO 8601格式将日期时间值序列化为字符串。

java.time

在解析/生成字符串时,默认情况下,Java中内置的java.time类使用ISO 8601格式。 因此无需指定格式化模式。

世界标准时间

最后的ZZulu缩写,意思是UTC (GMT)。

Instant

Instant类表示UTC时间轴上的一个时刻,分辨率为纳秒 。

 Instant instant = Instant.parse( "2011-09-28T21:48:25Z" ); 

时区

Instant调整到您想要的任何时区。

指定正确的时区名称 。 切勿使用3-4字母缩写,例如ESTIST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

 ZoneId z = ZoneId.of( "America/Montreal" ); // Or "Asia/Kolkata" etc. ZonedDateTime zdt = instant.atZone( z ); 

字符串

不要将日期时间值与表示此类值的字符串混淆。

您可以要求java.time对象以您希望的任何格式生成String。 但通常最好让DateTimeFormatter自动为您定位。

 Locale l = Locale.CANADA_FRENCH; // Or Locale.US, Locale.ITALY, etc. DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( l ); String output = zdt.format( f );