我在我的android项目中调用了WCF Web服务。我的Web服务从sql server数据库返回数据。我得到DateTime和时间(UTC)并获得如下的json:
{"CreateDate":"\/Date(1503952200000+0330)\/","FromTime":"PT15H30M"}
我搜索并阅读下面的链接,通过此链接,我可以解决DateTime问题,但对于时间数据类型,我有另一个问题。我的问题是:
com.google.gson.JsonSyntaxException: PT15H30M time
帮助链接是this。
如何解决时间数据类型jsonSyntaxException?
答案 0 :(得分:3)
*"'"
。那个字符串意味着“十五个半小时”。它不是一个时间。
我认为PT15H30M
不支持时间间隔。
它使用GSON
所以我将new GsonBuilder().setDateFormat(/* ... */).create();
添加为String并解析:
private String FromTime;
答案 1 :(得分:1)
Answer by Shoustin是正确的。这里与问题的背景更加相关。
1503952200000
可能自epoch reference date的1970-01-01T00:00:00Z
以来的毫秒数。
+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等效对象。