转换datetime并在MySQL中插入
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转换datetime并在MySQL中插入相关的知识,希望对你有一定的参考价值。
我必须导入一个包含120k行的CVS文件。前6列分别包含日期和时间,即:年,月,日,小时,分钟,秒。
我将它们导入Java:
int year = 2016
int month = 5
int day = 23
int hour = 15
int minutes = 57
int seconds = 22
如何将此格式转换为与mysql兼容的格式(DATETIME)?
我还有一个GMT专栏,即“GMT +0200”。我可以在DATETIME中转换这些数据吗?
您可以这样做的一种方法是以这种格式构建字符串:
yyyy-MM-DD HH:mm:ss
然后插入它。
插入有价值的价值观('2016-05-23 15:57:22')
String datetime = String.format("%s-%s-%s %s:%s:%s", year, month, day, hour, minutes, seconds);
这将产生你DATETIME
tl;dr
myPreparedStatement.setObject(
… ,
ZonedDateTime.of( 2016 , 5 , 23 , 15 , 57 , 22 , 0 , ZoneId.of( "Africa/Casablanca" ) )
) ;
Details
使用java.time类与driver支持JDBC 4.2或更高版本的MySQL 5.7 TIMESTAMP
列...
Time zone
确定用于该日期时间的时区。没有时区,日期时间没有确切含义。例如,法国巴黎的中午比蒙特利尔魁北克的中午早到。
以proper time zone name的格式指定continent/region
,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime
& Instant
使用您的输入和时区来实例化ZonedDateTime
以表示时间轴上的时刻。
ZonedDateTime zdt = ZonedDateTime.of( 2016 , 5 , 23 , 15 , 57 , 22 , 0 , z ) ;
提取与UTC中的值相同的时刻。
Instant instant = zdt.toInstant() ;
发送到数据库。
myPreparedStatement.setObject( … , instant ) ;
并检索。
Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
About java.time
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
现在在Joda-Time的maintenance mode项目建议迁移到java.time班。
要了解更多信息,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规格是JSR 310。
从哪里获取java.time类?
- Java SE 8,Java SE 9,以及之后 内置。 带有捆绑实现的标准Java API的一部分。 Java 9增加了一些小功能和修复。
- Java SE 6和Java SE 7 大部分java.time功能都在ThreeTen-Backport中反向移植到Java 6和7。
- Android ThreeTenABP项目特别适用于android的ThreeTen-Backport(如上所述)。 见How to use ThreeTenABP…。
ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
和more。
我(也)建议你使用java.time
。由于你有一个与UTC的偏移(为了我们的目的,UTC和GMT可以被认为是等价的),声明一个格式化器来解析它:
private static final DateTimeFormatter gmtOffsetFormatter
= DateTimeFormatter.ofPattern("'GMT' xx");
然后创建一个OffsetDateTime
对象:
ZoneOffset offset = ZoneOffset.from(gmtOffsetFormatter.parse(gmtOffsetString));
OffsetDateTime dateTime
= OffsetDateTime.of(year, month, day, hour, minutes, seconds, 0, offset);
System.out.println(dateTime);
这印刷品也许并不奇怪
2016-05-23T15:57:22+02:00
据我所知,您的数据库列具有数据类型datetime
,它不允许存储偏移量。您可能需要考虑使用timestamp
列。对于datetime
,您至少需要知道(或决定)在哪个偏移量或在哪个时区来解释数据库值。要将日期时间转换为您确定的数据库偏移量:
LocalDateTime dateTimeWithoutOffset = dateTime
.withOffsetSameInstant(ZoneOffset.UTC)
.toLocalDateTime();
我已将UTC作为典型和推荐的示例。我正在转换为LocalDateTime
,因为我认为这是存储到datetime
列中的合适类型,但这不是我的主场,我可能会弄错。该片段会生成2016-05-23T13:57:22
,这是我们日期时间的UTC等价物。要存储到数据库中,请关注Basil Bourque’s answer。 PreparedStatement.setObject()
很高兴接受LocalDateTime
。
如果您可以将列类型更改为timestamp
,请将Instant
存储到其中,如Basil Bourque的答案中所示。
Instant inst = dateTime.toInstant();
结果是2016-05-23T13:57:22Z
,因为Instant.toString()
在UTC中生成一个字符串。 timestamp
和Instant
的优势在于它们表示时间线上的明确点,因此您和维护代码的人都不需要担心时区或偏移。
以上是关于转换datetime并在MySQL中插入的主要内容,如果未能解决你的问题,请参考以下文章
java怎么使用日期格式化将时间插入mysql datetime数据类型中?
将代码片段插入数据库并在 textarea 中以相同方式显示
怎么样将java中的date类型插入到mysql的datetime
String str=“2011-11-11 22:22:22” 如何把str转换成datetime类型存入mysql中