2017-09-18 185 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()); 
相關問題