我有一个json输入,其中包含以下字段(其中包括):
...
leadDate: "2016-01-16",
leadTime: "13:45:22",
...
我试图使用Gson库解析这个json,将它们设置为以下Java属性:
private Date leadDate;
private Time leadTime;
但是setDateFormat方法不允许我在不使用DateFormat常量的情况下设置日期格式和时间格式。据我所知,这些并不包括我需要的格式。
如果我必须使用Gson,我该怎么办?
答案 0 :(得分:1)
JSON缺少任何日期时间data types。因此,字符串的格式和含义取决于您和您的数据提供者/消费者。
避免使用与最早版本的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。这样的序列化工具可以执行以下操作。
您的日期和时间是分开的。首先将每个解析为LocalDate
和LocalTime
。您的String输入都符合表示日期时间值的字符串的ISO 8601标准定义格式。这很方便,因为java.time类在解析或生成这样的字符串时会使用此标准作为默认值。
LocalDate localDate = LocalDate.parse( "2016-01-16" );
LocalTime localTime = LocalTime.parse( "13:45:22" );
LocalDate
和LocalTime
分别仅限日期和时间,并且都缺少任何时区或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
方法,如下所示 -
在leadDate-的情况下
Date.valueOf(value of leadDate);
在leadTime-
的情况下
Time.valueOf(value of leadTime);