【问题标题】:Java: milliseconds parsed wrongly when converted from string to timestampJava:从字符串转换为时间戳时解析错误的毫秒数
【发布时间】:2016-07-04 16:32:25
【问题描述】:

在将给定字符串解析为时间戳时遇到问题。 毫秒解析错误,或者如果我遗漏了什么,请告诉我。

我从请求中得到一个字符串:

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 有什么想法吗?

【问题讨论】:

  • 因为SSS的意思是毫秒,所以66被解析为66毫秒。
  • 新的 Java 8 时间 API 将 SSS 解释为秒的分数,因此它可以更好地处理 .66 输入,只要指定的模式 SS,而不是 SSS .

标签: java date timestamp


【解决方案1】:

让我们一步一步地分解它

你的代码(有效)

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;

输出是

解析日期:2016 年 7 月 4 日星期一 21:09:47 IST

创建时间:2016-07-04 21:09:47.006

因此,即使我传递了 6 毫秒作为参数,它也被解析为 600 毫秒,这很可能是因为我们使用了用于解析日期的 java 库和用于时间戳的 sql 库。两种语言处理日期对象的过程不同,因此不一致。毫秒也被处理为第 1000 精度(如 1000ms = 1s),因此 SQL 会自动将存储的 Java 转换为 6 到 006(或在您的情况下为 66 到 066)。

我对这个问题的简单解决方法是使用selectedTimeStamp.length() - selectedTimeStamp.lastIndexOf('.') 检查selectedTimeStamp 并连接剩余的零,即如果是2 则为2 个零,如果为3 则为1 个零,如果为4 则没有零。

这会给你正确的结果。

在 String selectesTimeStamp = "2016-07-04 21:09:47.6" 行之后添加这个

int x = selectedTimeStamp.length() - selectedTimeStamp.lastIndexOf('.');
            
if (x==2)
    selectedTimeStamp += "00";
if (x==3)
    selectedTimeStamp += '0';

干杯!!!

P.S.:将 SSS 更改为 SS 将不起作用。

【讨论】:

  • 我很高兴能为您提供帮助。但是我确信必须有另一种更有效的方法,如果我找到了,我会更新帖子,或者请其他人提出修改建议。
猜你喜欢
  • 2016-08-01
  • 1970-01-01
  • 2017-10-11
  • 2018-09-02
  • 2011-05-07
  • 2013-02-17
  • 2016-03-04
  • 2016-03-04
  • 2013-03-09
相关资源
最近更新 更多