转换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/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的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.DateCalendarSimpleDateFormat

现在在Joda-Timemaintenance mode项目建议迁移到java.time班。

要了解更多信息,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规格是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如IntervalYearWeekYearQuartermore

另一答案

我(也)建议你使用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 answerPreparedStatement.setObject()很高兴接受LocalDateTime

如果您可以将列类型更改为timestamp,请将Instant存储到其中,如Basil Bourque的答案中所示。

    Instant inst = dateTime.toInstant();

结果是2016-05-23T13:57:22Z,因为Instant.toString()在UTC中生成一个字符串。 timestampInstant的优势在于它们表示时间线上的明确点,因此您和维护代码的人都不需要担心时区或偏移。

以上是关于转换datetime并在MySQL中插入的主要内容,如果未能解决你的问题,请参考以下文章

java怎么使用日期格式化将时间插入mysql datetime数据类型中?

将代码片段插入数据库并在 textarea 中以相同方式显示

怎么样将java中的date类型插入到mysql的datetime

String str=“2011-11-11 22:22:22” 如何把str转换成datetime类型存入mysql中

mysql插入数据有(datetime类型怎么插入) 求一个完整的SQL语句

如何从 MySql 数据库中获取日期到 C# DateTime 对象?