2016-07-04 105 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

相关问题