如何使用Java中的Json Map创建SQL日期



我想将日期保存到java.sql.Date format: 中的MySql数据库

new Date();

输出:2015年9月4日星期五英国夏令时16:47:40

我需要从Json地图上获取日期:

created": {
    "date": 3,
    "day": 4,
    "hours": 14,
    "minutes": 49,
    "month": 8,
    "nanos": 0,
    "seconds": 59,
    "time": 1441288199000,
    "timezoneOffset": -60,
    "year": 115
}
Map<String, Object> dateMap = (Map<String, Object>) dateJsonObject;

如何使用上述日期映射中的值正确格式化新的sqlDate对象?

鉴于Json数据包含时间字段,我假设您引用的是MySQL DATETIME数据类型,而不是DATE数据类型。

要从Java向MySQL发送DATETIME值,您需要一个java.sql.Timestamp

如果您没有时区问题,最简单的方法是使用time值:

new Timestamp(1441288199000L)

对于时区问题,您应该使用timezoneOffset调整时区,或者将所有其他字段应用于Calendar

java.time

我建议您在java.time框架中完成大部分工作,该框架构建在Java8及更高版本中。(教程(

Instant是java.time的核心类,表示UTC时区中时间轴上的一个点。Instant类跟踪自epoch以来以纳秒为单位的时间,但有一个以毫秒为单位的工厂方法。

long millisecondsSinceEpoch = 1441288199000L;
Instant instant = Instant.ofEpochMilli( millisecondsSinceEpoch );
String output = instant.toString();

2015-09-03T13:49:59Z

JDBC

最终JDBC驱动程序将被更新为直接使用新的java.time类型。但与此同时,我们需要转换为java.sql.Timestamp

java.sql.Timestamp有新的附加方法用于转换到java.time.

java.sql.Timestamp ts = java.sql.Timestamp.from( instant );
String tsAsString = ts.toString( );

2015-09-03 06:49:59.0

请注意java.sql.Timestamp中善意但毫无帮助的特性,它的toString实现静默地应用JVM的当前默认时区。更糟糕的是,它无法附加调整后的时区的任何指示符,从而使该字符串变得更糟。

这里java.sql.Timestamp的toString应用了我的时区America/Los_Angeles,将日期时间向后移了7个小时。时间轴上的时刻与上面看到的Instant::toString输出相同,只是由美国西海岸的壁时间表示。其中一个原因是尽可能避免使用这些旧类,而是尽可能多地使用java.time。

java.sql.Date

问题询问的是java.sql.Date,它只是一个日期(UTC(,没有一天中的任何时间。

实际上,java.sql.Date同时拥有这两个(UTC时间00:00:00.0(,但却假装没有。(这个类是Java早期的一个糟糕的破解。(

为了得到java.sql.Date,我们需要一个LocalDate,我们可以从LocalDateTime得到它,我们可以在Instant得到它。

LocalDate localDate = LocalDateTime.ofInstant( instant , ZoneOffset.UTC ).toLocalDate();
java.sql.Date sqlDate = java.sql.Date.valueOf( localDate );

当地日期:2015-09-03sql日期:2015-09-03

尝试一下。。

从JSON中,时间值+小时+分钟+秒,您将获得9月3日14:49:59,因此GMT将为9月03日13:49:59…BST和GMT之间的时间偏移为60分钟。BST比GMT提前1小时。

    //assuming you need time adjusted to GMT...
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(1441288199000L);//"time": 1441288199000 >>> 2015-09-03
cal.set(Calendar.HOUR, 14);
cal.set(Calendar.MINUTE, 49);
cal.set(Calendar.SECOND, 59);
cal.add(Calendar.MILLISECOND, -60*60*1000); //timezone adjust, since you have the offset..
java.sql.Date sqlDate = new Date(cal.getTimeInMillis()) ;

最新更新