如何使用gson解析日期和时间?

时间:2016-01-25 15:00:19

标签: java json gson

我有一个json输入,其中包含以下字段(其中包括):

...
leadDate: "2016-01-16",
leadTime: "13:45:22",
...

我试图使用Gson库解析这个json,将它们设置为以下Java属性:

private Date leadDate;
private Time leadTime;

但是setDateFormat方法不允许我在不使用DateFormat常量的情况下设置日期格式和时间格式。据我所知,这些并不包括我需要的格式。

如果我必须使用Gson,我该怎么办?

2 个答案:

答案 0 :(得分:1)

JSON中没有日期时间类型

JSON缺少任何日期时间data types。因此,字符串的格式和含义取决于您和您的数据提供者/消费者。

使用java.time类

避免使用与最早版本的Java捆绑在一起的旧日期时间类,例如java.util.Date/.Calendar。众所周知,它们很麻烦。在Java 8及更高版本中,它们已被java.time框架正式取代。

转换器

Gson有converters for serializers/deserializers来处理脱水和再水化java.time对象的苦差事。见:Gson Type Adapters for Common Classes。或者考虑writing your own。这样的序列化工具可以执行以下操作。

解析

您的日期和时间是分开的。首先将每个解析为LocalDateLocalTime。您的String输入都符合表示日期时间值的字符串的ISO 8601标准定义格式。这很方便,因为java.time类在解析或生成这样的字符串时会使用此标准作为默认值。

LocalDate localDate = LocalDate.parse( "2016-01-16" );
LocalTime localTime = LocalTime.parse( "13:45:22" );

时区

LocalDateLocalTime分别仅限日期和时间,并且都缺少任何时区或offset-from-UTC信息。这些时区信息对于了解日期时间数据至关重要。您的示例数据是指巴黎,蒙特利尔或东京下午两点之前的四分之一?也许你有这个区域/偏移信息的其他数据字段,或者在你的上下文中你可以假设时区。

ZoneId zoneId = ZoneId.of( "America/Montreal" );

我们将该时区应用于仅限日期和时间,以获得完整的日期时间,即时间线上的实际时刻。

ZonedDateTime zdt = ZonedDateTime.of( localDate , localTime , zoneId );

字符串输出

只需调用toString即可输出符合ISO 8601标准的字符串。实际上,java.time通过在括号中附加时区名称来扩展ISO 8601格式。

  

2016-01-16T13:45:22-05:00 [美国/蒙特利尔]

要生成其他格式的字符串,请搜索StackOverflow.com以获取java.time.format包的许多示例。

Instant

通常,最佳做法是在UTC中进行业务逻辑和数据存储/交换。在java.time中,表示Instant类,表示UTC时间轴上的时刻。我们可以从Instant实例化ZonedDateTime对象。

Instant instant = zdt.toInstant();

答案 1 :(得分:0)

java.sql.Date java.sql.Time 已经有内置的方法。只需从json文件中读取数据并将其传递给valueOf方法,如下所示 -

  1. 在leadDate-的情况下 Date.valueOf(value of leadDate);

  2. 在leadTime-
    的情况下 Time.valueOf(value of leadTime);