7

我做了以下事情:

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

现在:

range.getTime();

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

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

4

6 回答 6

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,但由于BST/GMT 更改日期和时区无法跟踪的历史错误。Sun/Oracle 似乎认为这是历史上的“不准确”。

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

从您的语言(德语)来看,这可能不是直接由于这个 BST 问题,但几乎可以肯定是相关的。

于 2013-03-01T15:59:00.753 回答
1

Java Date 并非旨在计算给定时间段的持续时间。getTime() 调用返回自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。在您的情况下,您实际上最终得到的日期早于那个时代(因此是负数)。当我运行您的代码时,我得到 21661000。(请参阅Sean Landsman的答案,因为我相信他已经解释了为什么您会得到负面结果……提示:我的电话号码与 GMT 或 21600000 毫秒相差 6 小时)

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

PeriodFormatter formatter = new PeriodFormatterBuilder()
         .appendHours()
         .appendSeparator(":")
         .appendMinutes()
         .appendSeparator(":")
         .appendSeconds()
         .toFormatter();
Period period = formatter.parsePeriod("00:01:01");
assert period.toStandardDuration().getMillis() == 61000
于 2013-03-01T17:32:09.807 回答
0

hh:mm:ss代表 12 小时制时间,始终代表“时间点”,而不是“时间间隔”。所以当然,时区会影响价值。但是,在 GMT +0 中,该值等于表示“时间间隔”。

您只需要:

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

试试看!

于 2013-03-01T17:49:06.390 回答
0

According to the JavaDoc, getTime():

Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT represented by this Date object.

You want the number of milliseconds in one minute and one second.

(60*minutes+seconds)*1000

It really doesn't need to come from a Date object.

If you need to compute the time in milliseconds for some interval, maybe use the joda time library, or get the day, hour, minute, second and millisecond components out of your date object and compute the value by hand.

于 2013-03-01T16:06:19.327 回答
0

Try:

Date range1 = rangeFormatter.parse("00:01:01");
Date range2 = rangeFormatter.parse("00:00:00");
System.out.println(range1.getTime() - range2.getTime());
于 2013-03-01T16:07:54.613 回答
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());
于 2013-03-01T16:01:09.847 回答