Java 在MySQL中转换datatime和insert
我必须导入一个包含120k行的CVS文件。前6列分别包含日期和时间,即:年、月、日、时、分、秒 我将它们导入Java: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中转换此数据吗?可以这样做的一种方法是以以下格式生成字符串:
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
。由于您有一个与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();