Java 在MySQL中转换datatime和insert

Java 在MySQL中转换datatime和insert,java,mysql,database,datetime,type-conversion,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中转换此数据吗?可以这样做的一种方法是以以下格式生成字符串:

我必须导入一个包含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')

这将生成一个
DATETIME

tl;博士 细节 为列使用支持或更高版本的类

时区 确定该日期和时间的时区没有时区,日期时间就没有确切的含义。例如,法国巴黎的中午比魁北克山的中午早得多

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

zoneDateTime
&
Instant
将您的输入与时区一起用于实例化
zoneDateTime
,以表示时间线上的某个时刻

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 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

我(也)建议您使用
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
,不允许存储偏移量。您可能需要考虑<代码>时间戳< /代码>列。对于
日期时间
,您至少需要知道(或决定)在哪个偏移量或哪个时区解释数据库值。要将日期时间转换为确定的数据库偏移量,请执行以下操作:

    LocalDateTime dateTimeWithoutOffset = dateTime
            .withOffsetSameInstant(ZoneOffset.UTC)
            .toLocalDateTime();
我将UTC作为一个典型的推荐示例。我正在转换为
LocalDateTime
,因为我认为这是存储到
datetime
列中的合适类型,但这不是我的主字段,我可能弄错了。该代码片段的结果是
2016-05-23T13:57:22
,这是我们的日期时间的UTC等效值。要存储到数据库中,请执行以下操作
PreparedStatement.setObject()
乐意接受
LocalDateTime

如果可以将列类型更改为
时间戳
,请在其中存储
即时
,如Basil Bourque的回答所示

    Instant inst = dateTime.toInstant();

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

该列的作用是什么<代码>日期时间<代码>时间戳?这在各方面都是首选方式。使用数据时间类型而不是字符串可以告诉读者您正在处理什么,并免费提供数据验证。其优势是不可低估的。最重要的是,代码更容易阅读。谢谢你的详细回答。我现在才看到csv中有一列存储了“GMT”值,即“GMT+0200”。这是转换时区吗?是否?是的,或者更准确地说,它是一个时区偏移(在许多时区,偏移量随年份而变化,和/或历史上发生过变化,将来可能再次发生变化)。您可能应该找到一种方法来解析它。@Simon,
ZoneOffset.from(DateTimeFormatter.ofPattern('GMT'xx”)。parse(“GMT+0200”)
为您提供了一个
ZoneOffset
对象,您可以在构建
OffsetDateTime
@Simon编辑您的问题以包含所有相关细节,我将更新我的答案以显示
OffsetDateTime
类的用法。而且,在将来,在这里发布之前,尝试更彻底、更好地准备好所有细节,因为堆栈溢出意味着更正式,更像维基百科,而不是一个随意的讨论板。并通过编辑您的问题以记录您专栏的数据类型来回应我对您问题的评论。
2016-05-23T15:57:22+02:00
    LocalDateTime dateTimeWithoutOffset = dateTime
            .withOffsetSameInstant(ZoneOffset.UTC)
            .toLocalDateTime();
    Instant inst = dateTime.toInstant();