2016-07-04 112 views
0

將給定字符串解析爲時間戳時遇到問題。 錯誤地解析了毫秒,或者讓我知道是否丟失了某些東西。Java:從字符串轉換爲時間戳時錯誤地解析了毫秒

我從請求字符串:

String selectedTimeStamp = request.getParameter("selectTime"); 
System.out.println("selectedTimeStamp: "+selectedTimeStamp); 

,然後我用SimpleDateFormat的解析和格式化字符串:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US); 
Date parsedDate = sdf.parse(selectedTimeStamp); 
Timestamp timestamp = new java.sql.Timestamp(parsedDate.getTime());  
System.out.println("createdTime: " +timestamp); 

我得到的輸出是:

selectedTimeStamp: 2016-07-04 21:09:47.66 
createdTime: 2016-07-04 21:09:47.066 

不知道爲什麼毫秒從66轉換爲066?它應該是660 任何想法?

+2

因爲'SSS'意思是毫秒,所以'66'被解析爲66毫秒。 – Andreas

+0

新的Java 8時間API將'SSS'解釋爲小數秒,所以只要模式指定了'SS',而不是'SSS',它就可以更好地處理'.66'輸入。 – Andreas

回答

0

讓我們打破它一步一步

你的代碼(有效)

String selectedTimeStamp = "2016-07-04 21:09:47.6"; 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US); 
Date parsedDate = sdf.parse(selectedTimeStamp); 

System.out.println("parsedDate: " + parsedDate); 

Timestamp timestamp = new java.sql.Timestamp(parsedDate.getTime()); 
System.out.println("createdTime: " +timestamp); 

我猜想,這些都是你做的進口:

import java.sql.Timestamp; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Locale; 

輸出其中

parsedDate:Mon Jul 0 4 21時09分47秒IST 2016

createdTime:2016年7月4日21:09:47.006

所以,即使我通過6毫秒作爲參數,它得到了解析,以600毫秒,這是最可能是由於我們使用java庫來解析日期和sql庫來標記時間戳。處理日期對象的過程在兩種語言中都不相同,因此不一致。另外,毫秒以1000的精度處理(因爲1000ms = 1s),因此SQL會自動將Java存儲的6轉換爲006(或66至066)。

我簡單的解決方法這個問題將檢查selectedTimeStamp使用selectedTimeStamp.length() - selectedTimeStamp.lastIndexOf('.')並連接其餘的零,即如果它是2然後2零,如果3然後1零,如果4然後沒有零。

這會給你正確的結果。

字符串selectesTimeStamp後添加此= 「2016年7月4日21:09:47.6」 行

int x = selectedTimeStamp.length() - selectedTimeStamp.lastIndexOf('.'); 

if (x==2) 
    selectedTimeStamp += "00"; 
if (x==3) 
    selectedTimeStamp += '0'; 

乾杯!

P.S .:將SSS更改爲SS將不起作用。

+0

知道了!此解決方法將起作用。 –

+0

我很高興我可以幫忙。不過,我確定必須有另一種更有效的方式,如果我找到了,我會更新該帖子,或者其他人請提出修改。 – hackrush