如何在Json中发送java.util.Date?

时间:2015-08-03 09:47:55

标签: java json string http date

我需要在 json 中发送数据。重要的是我希望保留语言环境,以便接收者在当地时间获取日期。我怎么能这样做?

我不能简单地使用Date.toString(),因为如果他们的语言环境不同(不同的日期和月份名称等等),我将无法在接收端解析它。

有解决方法吗?

7 个答案:

答案 0 :(得分:6)

自1970年以来的很长一段时间都很好,但不是人类可读的,因此是用于测试/开发的PITA。

因此,请使用 ISO 8601标准日期时间 kitkat(其中android只是文字"yyyy-MM-dd'T'HH:mm:ss"(通常会在这里看到一个空格;和小数秒'T')。

时间区域也可以,但希望不需要(=在本地化时间内合并)。

在java 8之前使用T

答案 1 :(得分:4)

TL;博士

Instant.now()
       .toString()
  

2017-01-23T12:34:56.123456789Z

UTC

通常最好以UTC(GMT)交换日期时间值的数据。让接收器调整到所需的时区。

Instant

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

Instant instant = Instant.now() ;
String output = instant.toString() ;  // Generate a String in standard ISO 8601 format.
  

2017-01-23T12:34:56.123456789Z

您可以轻松解析该字符串。

Instant instant = Instant.parse( "2017-01-23T12:34:56.123456789Z" ) ; 

ISO 8601

ISO 8601标准定义了易于阅读的易于解析的格式,用于日期时间值的文本表示。这些格式非常适合数据交换。

在UTC中,表示上面示例中显示的格式。 T将日期部分与时间部分分开。最后ZZulu的缩写,表示UTC。

区域设置

该问题提到区域设置好像与时区相关。 Locale nothing 与时区有关。 Locale指定(a)用于翻译日期名称,月份名称等的人类语言,以及(b)决定缩写,大小写,标点符号等问题的文化规范。

时区是区域offset-from-UTC更改的历史记录,可跟踪导致Daylight Saving Time (DST)等更改的异常情况。

搜索Stack Overflow以了解更多信息。这已经被覆盖了数百次。搜索ZoneIdZoneOffsetZonedDateTimeInstantOffsetDateTimeDateTimeFormatter等类。阅读java.time类的Oracle Tutorial

ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ;

关于 java.time

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

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:3)

使用java.util.Date的getTime方法作为时间戳。一旦你将它转换回日期,每个接收者都可以使用它的本地时区显示它。

记住日期

  

表示特定的时刻,精确到毫秒。

toString方法只是在specific way

中对其进行格式化
dow mon dd hh:mm:ss zzz yyyy

选择发送时间戳意味着您也使用更少的带宽。

答案 3 :(得分:2)

执行此操作的正确方法是以ISO 8601格式编写日期: 即2015-08-03T4:50:49+00:00

不仅包含时区,而且JSON接收端的任何标准解码器都能够正常解码。

对于发送部分,如果您自己编写字符串,请将其格式化:

ZonedDateTime.now( ZoneId.systemDefault() )
             .format( DateTimeFormatter.ISO_DATE_TIME )

但是,如果您使用任何JSON序列化程序从Java对象(例如Jackson)进行转换,那么只需将对象属性设为java.util.Date,并且在给定正确设置的情况下,序列化程序应该知道该怎么做。有关杰克逊的信息,请参见this answer,对泽西岛,请参阅this one。他们都使用Joda Time。

答案 4 :(得分:1)

我认为有一种简单的方法可以做到这一点,

DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
yourJsonObject.accumulate("yourDateVarible",dateFormat.format(new Date()));

答案 5 :(得分:0)

有很多方法可以做到这一点。 一种转换日期的方法,以毫秒为单位,不依赖于语言环境并进一步使用。 另一种以utc格式更改日期并进一步使用它的方法。如果服务器的时区设置为UTC,则java.util.Date将完美运行,因为默认情况下使用新日期(“某个日期”)时会占用系统时区。示例:

   long lastAccessedDate =  110002028250;
  String myDate = new java.util.Date(lastAccessedDate()).toString();
如果系统时区为UTC,

myDate将是“Tue Jun 06 05:30:00 UTC 2017”。

答案 6 :(得分:-1)

试试这种格式: 2017-03-20T00:00:00.000 + 0100