在gson builder中添加格式日期后时间不正确

时间:2016-07-20 13:24:12

标签: android gson date-formatting

我有从mongodb返回的json字符串。

[{"_id":"578bb51aa51d15940688809e","name":"aaa","date":"2016-07-20T11:47:39.302Z"}]

我使用gson转换Java对象。我得到了Unparseable date: "2016-07-20T11:47:39.302Z"。所以我将日期格式添加到gson构建器。

Gson gson=  new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create();

日期结果为Wed Jul 20 11:47:39 MMT 2016。时间是incorrect

日期字符串的日期格式模式有哪些?

如何按给定日期字符串选择合适的日期格式模式?

1 个答案:

答案 0 :(得分:4)

如果我没有记错的话,您的时区信息就会出现问题。 JavaScript Date对象和Java Date对象都代表universal coordinated time(UTC)中的一个点。 JavaScript Date对象和Java Date对象都不包含时区信息。

旁注: Java Date对象确实实际包含时区信息,这就是为什么您会看到时区(MMT的情况)当你致电date.toString()时。但是,这个时区应该 忽略 ,因为时区不规则性会突出显示带有Java 7日期/时间类的many issues部分。

GsonBuilder().setDateFormat()方法设置Java Date对象应序列化和反序列化的字符串格式。此格式不包含任何时区信息,因为Date对象不包含该信息。

为了显示您的Date对象在正确的时区中表示的UTC时间,您必须提供该时区。在使用Gson进行反序列化时不会这样做,但是当您实际显示日期/时间时:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getDefault());

String zonedDateTime = simpleDateFormat.format(date);

Android还附带了一个方便的DateUtils课程,而不是SimpleDateFormat课程,它将为您处理时区信息,以及Locale信息。

DateUtils.formatDateTime(getContext(), date.getTime(),
                        DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_ABBREV_ALL);