我想将日期保存到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()) ;