如何在Java中使用Json映射创建SQL日期?

如何在Java中使用Json映射创建SQL日期?,java,mysql,json,date,Java,Mysql,Json,Date,我想以java.sql.date格式将日期保存到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,

我想以
java.sql.date格式将日期保存到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;
created”:{
“日期”:3,
“天”:4,
“小时数”:14,
“分钟”:49,
“月”:8,
“纳米”:0,
“秒”:59,
“时间”:1441288199000,
“时区偏移”:-60,
“年份”:115
}
Map dateMap=(Map)dateJsonObject;

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

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

要从Java向MySQL发送
DATETIME
值,需要
Java.sql.Timestamp

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

new Timestamp(1441288199000L)
对于时区问题,您应该使用
timezoneOffset
调整时区,或者将所有其他字段应用于
日历

尝试一下

从JSON的时间值+小时+分钟+秒,您将有9月3日14:49:59,因此GMT将是9月3日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()) ;
java.time 我建议您在内置于Java8及更高版本的框架中完成大部分工作。()

是java.time的核心类,表示时区中时间轴上的一个点。Instant类跟踪时间,但有一个工厂

2015-09-03T13:49:59Z

JDBC 最终JDBC驱动程序将被更新为直接使用新的java.time类型

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中用意良好但没有帮助的特性,它的实现会默默地应用您的时间戳。更糟糕的是,它没有附加任何调整时区的指示符,从而使这个字符串变得毫无价值

这里java.sql.Timestamp应用了我的时区,将日期时间向后移动了七个小时。时间轴上的时刻与上面看到的输出相同,仅由美国西海岸的代表表示。这是尽可能避免使用这些旧类并尽可能使用java.time的众多原因之一

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

实际上,java.sql.Date同时具有这两个属性(UTC中的时间为00:00:00.0),但却假装没有。(这个类是java早期的一个坏习惯。)

要获取
java.sql.Date
我们需要一个可以从
LocalDateTime
中获取的
Instant

LocalDate localDate = LocalDateTime.ofInstant( instant , ZoneOffset.UTC ).toLocalDate();
java.sql.Date sqlDate = java.sql.Date.valueOf( localDate );
本地日期:2015-09-03 sqlDate:2015-09-03

如果在java中使用DATE(),考虑使用JodTaMes DATITEME(),使日期工作变得更容易。
LocalDate localDate = LocalDateTime.ofInstant( instant , ZoneOffset.UTC ).toLocalDate();
java.sql.Date sqlDate = java.sql.Date.valueOf( localDate );