Java:从字符串转换为时间戳时,错误地解析了毫秒

时间:2016-07-04 16:32:25

标签: java date timestamp

在将给定字符串解析为时间戳时遇到问题。 毫秒被错误地解析或让我知道我是否遗漏了什么。

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

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 任何想法?

1 个答案:

答案 0 :(得分:0)

让我们一步一步地分解

您的代码(有效)

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

我假设这些是您所做的进口:

selectedTimeStamp

其输出为

  

parsedDate:Mon Jul 04 21:09:47 IST 2016

     

createdTime:2016-07-04 21:09:47.006

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

我简单的解决方法这个问题是使用selectedTimeStamp.length() - selectedTimeStamp.lastIndexOf('.')检查int x = selectedTimeStamp.length() - selectedTimeStamp.lastIndexOf('.'); if (x==2) selectedTimeStamp += "00"; if (x==3) selectedTimeStamp += '0'; 并连接剩余的零,即如果是2然后是2个零,如果是3然后是1,如果是4那么没有零

这会给你正确的结果。

在String selectesTimeStamp =" 2016-07-04 21:09:47.6"之后添加此项线

$( '.header__menu_icon' ).click(function() {
  var allClasses = 'right_0 right_280 right_minus_280';
  $( '.mobile_menu, .wrap' ).removeClass( allClasses );
  if ( $('.wrap' ).css( 'right' ) == '0px' ) { 
    $( '.wrap' ).addClass( 'right_280' ); 
  }
  else { 
    $( '.wrap' ).addClass( 'right_0' ); 
  }
});

干杯!!!

P.S。:将SSS更改为SS将无效。