为什么SimpleDateFormat.parse().getTime()返回一个不正确的(负)值?

use*_*015 8 java date

我有一个String类型的时间戳,我试图将它转换为double(并在几秒钟内找到结果),这就是我所做的:

double mytimeStamp = 0;

String timeStamp = new SimpleDateFormat(" mm ss S").format(new Date( ));   

SimpleDateFormat dateFormat = new SimpleDateFormat(" mm ss S");

try {
  mytimeStamp = ((double)dateFormat.parse(timeStamp).getTime())/1000;
} catch (ParseException e1) {
  // TODO Auto-generated catch block
  e1.printStackTrace();
}

System.out.println("timeStamp is: "+ mytimeStamp);
Run Code Online (Sandbox Code Playgroud)

问题是我获得了一个值-2722.515,我不知道为什么.

它为什么是否定的?

代码有问题吗?

当我将此时间戳转换为mm ss S与实时不匹配时,这似乎是另一个问题!

Duk*_*ing 13

这是一个时区差异问题.

由于您只指定了分钟和秒,因此日期将打开1 Jan 1970 00:mm:ss(mm并且ss是当前时间的分钟和秒).

我将你的例子简化为:

String timeStamp = "00 00 00";
SimpleDateFormat dateFormat = new SimpleDateFormat("HH mm ss");
double hour = dateFormat.parse(timeStamp).getTime()/1000.0/60/60;
System.out.println("hour is: "+ hour);
Run Code Online (Sandbox Code Playgroud)

打印出的小时应该GMT偏离当地时区.

原因是:

SimpleDateFormat是区域设置敏感的,因此dateFormat.parse(timeStamp)将返回Date为给定时区创建一个对象(默认为本地时区).然后getTime()从中获取毫秒数midnight 1 Jan 1970 **GMT**.因此,该值将被本地时区的距离所抵消GMT.

如何解决:

您可以通过在dateFormat调用之前设置对象的时区来修复它,parse如下所示:

dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
Run Code Online (Sandbox Code Playgroud)