转换datetime并在MySQL中插入

问题描述 投票:1回答:4

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

java mysql database datetime type-conversion
4个回答
3
投票

您可以这样做的一种方法是以这种格式构建字符串:

yyyy-MM-DD HH:mm:ss

然后插入它。

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


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

这将产生你DATETIME


2
投票

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


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

© www.soinside.com 2019 - 2024. All rights reserved.