2017-09-18 212 views
-1

我有一个String如下面要被转换为java.sql.Date格式:转换为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) 
+0

的[如何转换的java.util可能的复制。 Date to java.sql.Date?](https://stackoverflow.com/questions/530012/how-to-convert-java-util-date-to-java-sql-date) – soorapadman

+0

你需要什么'java .sql.Date' for?如果是针对数据库的,请注意,您可能已经(或已经拥有)了一个更新的JDBC驱动程序,它可以让您从数据库中检索java.time.LocalDate对象,并将相同类型存储到该对象中。如果是这样,我建议您从'java.sql'中取消过时的类,并使用'java.time'中的现代类替代。 –

回答

2

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); 
1

您需要在您的格式

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

要获得timestamp只使用java.sql.Timestamp代替java.sql.Date

java.sql.Timestamp对象的toString()方法,你需要将返回的字符串。

0

您使用的格式良好,但您松散的时区偏移量。

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

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

结果:

utilDate = Thu Aug 31 01:40:00 IST 2017

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

结果:

utilDate = Thu Aug 31 07:10:00 IST 2017.

我正在从印度这个代码,并有在时区偏移的05:30小时。

1

您正在使用hh模式,该模式对应于hour-of-am-pm field(值从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的缺省时区(给你的印象这是错误的:详见this article)。

另外,请记住,java.sql.Date只是keeps the date fields(日/月/年),将小时设置为零(因此01:40丢失)。另一方面,java.sql.Timestamp保留whole UTC millis value


新的Java日期/时间API

老班(DateCalendarSimpleDateFormat)有lots of problemsdesign issues,他们正在被新的API取代。

如果您使用Java 8,请考虑使用new java.time API。这很容易,less bugged and less error-prone than the old APIs

如果您使用的Java 6或7,则可以使用ThreeTen Backport,对Java 8的新的日期/时间类有很大反向移植。而对于Android,您还需要ThreeTenABP(更多关于如何使用它here)。

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

首先,分析输入到OffsetDateTime,使用DateTimeFormatter指定格式:

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反向移植有org.threeten.bp.DateTimeUtils类:

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