java - 为什么 SimpleDateFormat.parse().getTime() 返回不正确(负)值?

标签 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);

问题是我得到了一个像 -2722.515 这样的值,我不知道为什么。

为什么是负数?

代码有问题吗?

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

最佳答案

这是一个时区差异问题。

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

我将您的示例简化为:

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);

打印出来的小时应该是 GMT 相对于本地时区的时差。

这样做的原因是:

SimpleDateFormat 是语言环境敏感的,因此 dateFormat.parse(timeStamp) 将返回为给定时区创建一个 Date 对象(默认为本地时区)。然后 getTime() 获取从 1970 年 1 月 1 日午夜 **GMT** 开始的毫秒数。因此,该值将根据本地时区与 GMT 的距离进行偏移。

如何修复:

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

dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));

关于java - 为什么 SimpleDateFormat.parse().getTime() 返回不正确(负)值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15003498/

相关文章:

python - pandas.read_csv() 可以在同一列中应用不同的日期格式!这是一个已知的错误吗?如何解决?

python - 将日期分为日、月、周 Django

java - 在 bitbucket 管道上执行 gradle 后出现 "Could not complete execution for Gradle Test Executor 2"错误

java - MongoDB:分组后获取具有最大版本ID的条目

date - 如何更改 CakePHP 3 表单中出生日期字段的顺序

python - 使用 pandas 确定日期是否存在间隙

java - 即使没有什么是静态的,也无法进行静态引用?

java - 获取每月第一天的工作日 - Android Studio

java - Spring 3 可以与 Acegi Security 配合使用吗?

c# - 日期的计算算法