繁体   English   中英

转换为java.sql.Date

[英]Conversion to java.sql.Date

我有以下String ,需要将其转换为java.sql.Date格式:

2017-08-31 01:40:00+00:00

我正在使用下面的代码,我可以看到日期仅被解析为2017-08-31而不是整个字符串。 有人可以建议吗?

java.util.Date utilDate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(dateTimeStamp);

java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());

基于答案中的建议,我实现了以下内容:

String dateTimeStamp = "2017-08-31 01:40:00+00:00";
java.text.DateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ssZZ");
java.util.Date date = format.parse(dateTimeStamp);
java.sql.Timestamp timestamp = new java.sql.Timestamp(date.getTime());
System.out.println("timestamp - " + timestamp);

但是,出现以下错误:

java.text.ParseException: Unparseable date: "2017-08-31 01:40:00+00:00"
        at java.text.DateFormat.parse(DateFormat.java:366)
        at com.eneco.mysqlsink.WeatherForecastSink.WeatherForecastTask.put(WeatherForecastTask.java:94)
        at org.apache.kafka.connect.runtime.WorkerSinkTask.deliverMessages(WorkerSinkTask.java:435)
        at org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:251)
        at org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:180)
        at org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:148)
        at org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:146)
        at org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:190)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

java.sql.Date仅提供日期。.您需要使用java.sql.Timestamp来获取日期和时间。

java.text.DateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
java.util.Date date = format.parse("2017-08-31 01:40:00+00:00");
java.sql.Timestamp timestamp = new java.sql.Timestamp(date.getTime());
System.out.println(timestamp);

您需要在格式中包含时区标识符

java.util.Date utilDate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ssZZ").parse(dateTimeStamp);
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); 

您正在使用hh模式,该模式对应于am-of-pm-pm字段 (值从1到12)。 由于输入没有AM / PM指示符,因此这将无法始终按预期工作。 您必须将其更改为HH一天中的小时 ,值从0到23)。

另外,要解析偏移量+00:00您需要使用X模式:

String input = "2017-08-31 01:40:00+00:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssX");
// java.util.Date
Date date = sdf.parse(input);

X模式是Java 7中引入的。如果使用的是旧版本,则还可以在格式化程序中设置UTC时区:

// "X" is not supported
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// set UTC in the formatter
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
// java.util.Date
Date date = sdf.parse(input);

这更糟,因为您需要知道输入的偏移量,并在格式化程序中进行设置。 因此,如果支持,最好使用X

然后,您可以从java.util.Date创建sql日期:

java.sql.Date sqlDate = new java.sql.Date(date.getTime());
java.sql.Timestamp timestamp = new Timestamp(date.getTime());

但是请记住,如果仅将System.out.println为sql日期或时间戳,则这些日期或时间戳将转换为JVM默认时区(给您以为是错误的印象:有关更多详细信息,请参阅本文 )。

另外,请记住, java.sql.Date保留日期字段 (日/月/年),将小时设置为零(因此丢失了01:40 )。 另一方面, java.sql.Timestamp保留整个UTC millis值


Java新的日期/时间API

旧的类( DateCalendarSimpleDateFormat )存在很多问题设计问题 ,并且已被新的API取代。

如果您使用的是Java 8 ,请考虑使用新的java.time API 与旧的API相比 ,它更容易, 更不会出错且更不会出错

如果您使用的是Java 6或7 ,则可以使用ThreeTen Backport ,它是Java 8的新日期/时间类的绝佳反向端口 对于Android ,您还需要ThreeTenABP (更多有关如何在此处使用它的信息 )。

下面的代码对两者都适用。 唯一的区别是包名称(在Java 8中为java.time ,在ThreeTen Backport(或Android的ThreeTenABP)中为org.threeten.bp ),但是类和方法相同。

首先,使用DateTimeFormatter将输入解析为OffsetDateTime ,以指定格式:

String input = "2017-08-31 01:40:00+00:00";

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssXXX");
OffsetDateTime odt = OffsetDateTime.parse(input, fmt);

然后,您可以将其转换为sql类型。 在Java 8中,有内置方法可以做到这一点:

java.sql.Date sqlDate = java.sql.Date.valueOf(odt.toLocalDate());
java.sql.Timestamp sqlTimestamp = java.sql.Timestamp.from(odt.toInstant());

在Java 7中,ThreeTen Backport具有org.threeten.bp.DateTimeUtils类:

java.sql.Date sqlDate = DateTimeUtils.toSqlDate(odt.toLocalDate());
java.sql.Timestamp sqlTimestamp = DateTimeUtils.toSqlTimestamp(odt.toInstant());

要获取timestamp只需使用java.sql.Timestamp而不是java.sql.Date

java.sql.Timestamp对象的toString()方法应根据需要返回字符串。

您使用的格式不错,但是您松开了时区偏移。

如果要考虑TimeZone偏移,请使用以下格式。

java.util.Date utilDate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(dateTimeStamp);

结果:

utilDate = 2017年8月31日星期四01:40:00

java.util.Date utilDate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ssX").parse(dateTimeStamp);

结果:

utilDate = IST 2017年8月31日星期四07:10:00。

我正在印度运行此代码,时区偏移时间为05:30。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM