转换数据时间并在MySQL中插入

时间:2017-12-23 20:41:30

标签: java mysql database datetime type-conversion

我必须导入一个包含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中转换这些数据吗?

4 个答案:

答案 0 :(得分:3)

您可以采用以下格式构建字符串:

yyyy-MM-DD HH:mm:ss

然后插入。

插入有价值的价值观(' 2016-05-23 15:57:22')

答案 1 :(得分:2)

String datetime = String.format("%s-%s-%s %s:%s:%s", year, month, day, hour, minutes, seconds);

这会产生DATETIME

答案 2 :(得分:2)

TL;博士

myPreparedStatement.setObject( 
    … , 
    ZonedDateTime.of( 2016 , 5 , 23 , 15 , 57 , 22 , 0 , ZoneId.of( "Africa/Casablanca" ) )
) ;

详细

使用java.timedriver支持JDBC 4.2或更高版本的MySQL 5.7 TIMESTAMP列...

时区

确定用于该日期时间的时区。 没有时区,日期时间没有确切含义。例如,法国巴黎的中午比蒙特利尔魁北克的中午早到。

continent/region的格式指定proper time zone name,例如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 ) ;

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

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

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 3 :(得分:1)

我(也)建议您使用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的优势在于它们表示时间线上的明确点,因此您和维护代码的人都不需要担心时区或偏移。