java.util.Date得到毫秒

时间:2013-03-01 15:44:15

标签: java date time

我做了以下事情:

String standardRange = "00:01:01";
SimpleDateFormat rangeFormatter = new SimpleDateFormat("hh:mm:ss");
Date range = rangeFormatter.parse(standardRange);

现在:

range.getTime();

..我的输出为-3539000而不是61,000

我不确定我做错了什么;在调试时,cdate存在,该属性包含fraction,其中包含值61,000,这就是我想要的。

6 个答案:

答案 0 :(得分:3)

你看到这个的原因是你创建的日期实际上是在日期时代的过去,而不是在它之后1m1s:

String standartRange = "00:01:01";
SimpleDateFormat rangeFormatter = new SimpleDateFormat("hh:mm:ss");
Date range = rangeFormatter.parse(standartRange);

System.out.println(new Date(0L));
System.out.println(new Date(0L).getTime());
System.out.println(range);
System.out.println(range.getTime());

及其输出;

Thu Jan 01 01:00:00 GMT 1970
0
Thu Jan 01 00:01:01 GMT 1970
-3539000

这里的纪元日期不正确 - 它应该是00:00:00,但由于historical bug BST / GMT更改了日期和时区无法跟踪。似乎Sun / Oracle认为这是一个历史性的“不准确”。

查看错误报告 - 它更全面地描述了问题。

根据您的语言(德语),这可能不是由于此BST问题直接导致的,但它几乎肯定是相关的。

答案 1 :(得分:1)

Java Date不是为计算给定时间段的持续时间而设计的。 getTime()调用返回自1970年1月1日00:00:00 GMT以来的毫秒数。在你的情况下,你实际上最终会得到一个在该纪元之前的日期(因此是负数)。当我运行你的代码时,我得到了21661000.(请参阅Sean Landsman的回答,因为我相信他已经找到了为什么会得到负面结果...提示:我的号码正好是格林尼治标准时间的6小时或21600000毫秒)< / p>

Joda-Time是一个非常适合解决您的潜在问题的库。

PeriodFormatter formatter = new PeriodFormatterBuilder()
         .appendHours()
         .appendSeparator(":")
         .appendMinutes()
         .appendSeparator(":")
         .appendSeconds()
         .toFormatter();
Period period = formatter.parsePeriod("00:01:01");
assert period.toStandardDuration().getMillis() == 61000

答案 2 :(得分:0)

为了得到你想要的东西,你应该比较你想要的时间和时间的来源。使用以下代码:

String standardRange = "00:01:01";
SimpleDateFormat rangeFormatter = new SimpleDateFormat("HH:mm:ss");
Date range = rangeFormatter.parse(standardRange);
Date range2 = rangeFormatter.parse("00:00:00");
System.out.println(range.getTime() - range2.getTime());

答案 3 :(得分:0)

根据JavaDoc,getTime()

  

返回自此Date对象表示的1970年1月1日00:00:00 GMT以来的毫秒数。

您需要一分钟和一秒钟内的毫秒数。

(60*minutes+seconds)*1000

它实际上不需要来自Date对象。

如果您需要计算某个时间间隔的时间(以毫秒为单位),可以使用joda time库,或者从日期对象中获取日,小时,分钟,秒和毫秒组件并手动计算值

答案 4 :(得分:0)

尝试:

Date range1 = rangeFormatter.parse("00:01:01");
Date range2 = rangeFormatter.parse("00:00:00");
System.out.println(range1.getTime() - range2.getTime());

答案 5 :(得分:0)

hh:mm:ss代表12小时的时间,它总是代表“时间点”,而不是“时间间隔”。所以,时区肯定会影响价值。但是,在GMT +0中,该值等于表示“时间间隔”。

您只需要:

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

试试吧!