[英]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值 。
旧的类( Date
, Calendar
和SimpleDateFormat
)存在很多问题和设计问题 ,并且已被新的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.