3

我试图了解 GregorianCalendar 作为经验丰富的 Delphi (pascal) 开发人员学习 java。根据文档,1970 年 1 月 1 日 0:00:00 是计算从这一点开始经过的时间(以秒为单位)的参考。所以,在实验中,我设置了一个新变量

GregorianCalendar cal2 = new GregorianCalendar(1970, 0, 1, 0, 0, 0); //January=0, Day=1, Hour=0, Min=0, Sec=0

然后我读了时间

cal2.getTimeInMillis()

根据定义,这应该等于零。然而我得到了 18,000,000 毫秒。这是5个小时。我在想这与时区有关吗?任何建议,我在东区。

如果是这样,我该如何解释?我真的很想理解,所以我可以计算两次之间的秒数差异。不明白这一点,我不能继续!谢谢!道格

4

4 回答 4

2
package so;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class BeginningOfTime {

  public static void main (final String[] args) {

    final Calendar localTZ = new GregorianCalendar (1970, 0, 1, 0, 0, 0);
    dump (localTZ);

    final Calendar utcTZ = new GregorianCalendar ();
    utcTZ.clear ();
    utcTZ.setTimeZone (TimeZone.getTimeZone ("UTC"));
    dump (utcTZ);
  }

  private static final void dump (final Calendar c) {

    System.out.printf ("%s: %d (offset %d)%n",
                       c.getTimeZone ().getDisplayName (),
                       c.getTimeInMillis (),
                       c.get (Calendar.ZONE_OFFSET));
  }
}

产生这个:

Eastern Standard Time: 18000000 (offset -18000000)
Coordinated Universal Time: 0 (offset 0)
于 2012-08-29T02:17:47.537 回答
1

我知道这不能直接回答您的问题,但GregorianCalendar可能不是这里最好的方法。我建议您使用Joda Time 之类的库,因为您正在专门寻找诸如DurationPeriod之类的概念。还可以看看ThreeTen的JSR 310的 RI ,它计划用于Java 8

这是一个以秒为单位计算经过时间的JodaTime解决方案。

  DateTime start = new DateTime(2012, 3, 25, 0, 0, 0, 0);
  DateTime end = new DateTime(2012, 3, 26, 0, 0, 0, 0); 
  int seconds = Seconds.secondsBetween(start, end).getSeconds();
于 2012-08-29T02:42:10.410 回答
0

我敢打赌它是东部时区。最大的问题是:你必须考虑它吗?您要在同一时区计算/记录时间吗?该类有很多功能,但它变得非常臃肿,但非常方便。

GregorianCalendar 类确实包含时区功能,还可以做一些事情,比如给你 DST 偏移量。

于 2012-08-29T02:04:20.403 回答
0
于 2018-02-06T03:03:53.237 回答