如何解析时间PT15H30M收到的json string int Time对象?

时间:2017-09-03 08:17:07

标签: java android wcf time gson

我在我的android项目中调用了WCF Web服务。我的Web服务从sql server数据库返回数据。我得到DateTime和时间(UTC)并获得如下的json:

{"CreateDate":"\/Date(1503952200000+0330)\/","FromTime":"PT15H30M"}

我搜索并阅读下面的链接,通过此链接,我可以解决DateTime问题,但对于时间数据类型,我有另一个问题。我的问题是:

com.google.gson.JsonSyntaxException: PT15H30M time 

帮助链接是this

如何解决时间数据类型jsonSyntaxException?

2 个答案:

答案 0 :(得分:3)

ISO 8601 time intervals相关的

*"'"。那个字符串意味着“十五个半小时”。它是一个时间。

我认为PT15H30M不支持时间间隔。

它使用GSON

所以我将new GsonBuilder().setDateFormat(/* ... */).create();添加为String并解析:

private String FromTime;

答案 1 :(得分:1)

Answer by Shoustin是正确的。这里与问题的背景更加相关。

计数-从历元

1503952200000 可能epoch reference date1970-01-01T00:00:00Z以来的毫秒数。

偏移 - 从-UTC

+0330看起来像offset-from-UTC。问题是,我们无法判断这是否意味着从UTC开始计算,我们应该调整三个半小时,或者如果从一个时期开始计数已经调整为三和 - 半小时。我会和前者一起去。

这是一种糟糕的格式,用于将日期时间值作为文本进行通信。如果您有任何控制权,请更改为使用标准ISO 8601格式化字符串。

long count = Long.parseLong( "1503952200000" ) ;
Instant instant = Instant.ofEpochMilli( count ) ;

ZoneOffset offset = ZoneOffset.of( "+0330" ) ;
OffsetDateTime odt = instant.atOffset( offset ) ;

持续时间

正如Shoustin解释的那样,“PT15H30M”是一个15小时30分钟的span-of-time - 而不是一天中的时间。

Duration d = Duration.parse( "PT15H30M" ) ;

如果您希望到达时间线上的其他位置,可以将其添加到OffsetDateTime

OffsetDateTime odtLater = odt.plus( d ) ;

请参阅此代码在IdeOne.com直播。

  

数:1503952200000

     

instant.toString():2017-08-28T20:30:00Z

     

odt.toString():2017-08-29T00:00 + 03:30

     

odtLater.toString():2017-08-29T15:30 + 03:30

伊朗时间无效?

顺便说一句,我对三个半小时的偏移感到困惑。查看current time zones列表,+ 03:30偏移的唯一情况是Asia/Tehran时区。但这是标准时间,而不是在给定的8月日期间有效的夏令时(DST)。对于 2017-08-29的日期,地球上任何地方都没有+03:30 的偏移量。

所以我怀疑你的数据有错误。我怀疑从上帝开始的计数是单独计算的,并且偏移量是在事后粘合的。这是您输入字符串格式设计如此差的原因的一个示例。坚持使用ISO 8601,并避免将时间作为从纪元开始计算。

在知道时使用时区,而不是仅仅偏离UTC。偏移量仅为小时数和分钟数。时区是特定区域在不同时间点使用的过去,现在和将来的偏移的历史。 ZonedDateTime::toString方法明智地扩展了ISO 8601,将区域名称附加在方括号中。

ZonedDateTime zdt = ZonedDateTime.parse( "2017-08-29T15:30+04:30[Asia/Tehran]" ) ;
String output = zdt.toString() ;  
  

2017-08-29T15:30 + 04:30 [亚/德黑兰]

提示:通常最好以UTC格式交换日期时间数据,作为Instant个对象或ISO 8601等效对象。