乔达时间getSecondOfDay上DST开关天(Joda Time getSecondOfDay

2019-09-27 07:16发布

我是从约达时间试图让秒钟,因为午夜在DST开关一天,当遇到奇怪的行为。

我的代码:

public static void main(String[] args) {

    DateTimeZone timeZone = DateTimeZone.getDefault();
    System.out.println(timeZone);

    DateTimeFormatter dateFormatter = DateTimeFormat.shortDate();
    DateTimeFormatter dateTimeFormatter = DateTimeFormat.fullDateTime();
    LocalDate date = new LocalDate(2016, 10, 29);
    for (int i=0; i<3; i++) {

        System.out.println();
        System.out.println(dateFormatter.print(date) + ":");

        {
            DateTime instant = new DateTime(date.getYear(), date.getMonthOfYear(), date.getDayOfMonth(), 1, 0, 0, timeZone);
            System.out.println(dateTimeFormatter.print(instant) + " // " + instant.getSecondOfDay() + " // " + instant.getZone().getOffset(instant));
        }

        {
            DateTime instant = new DateTime(date.getYear(), date.getMonthOfYear(), date.getDayOfMonth(), 10, 0, 0, timeZone);
            System.out.println(dateTimeFormatter.print(instant) + " // " + instant.getSecondOfDay() + " // " + instant.getZone().getOffset(instant));
        }

        date = date.plusDays(1);
    }
}

输出:

Europe/Berlin

29.10.16:
Samstag, 29. Oktober 2016 01:00 Uhr MESZ // 3600 // 7200000
Samstag, 29. Oktober 2016 10:00 Uhr MESZ // 36000 // 7200000

30.10.16:
Sonntag, 30. Oktober 2016 01:00 Uhr MESZ // 3600 // 7200000
Sonntag, 30. Oktober 2016 10:00 Uhr MEZ // 36000 // 3600000

31.10.16:
Montag, 31. Oktober 2016 01:00 Uhr MEZ // 3600 // 3600000
Montag, 31. Oktober 2016 10:00 Uhr MEZ // 36000 // 3600000

(翻译德国:MEZ = CET,MESZ = CEST)

正如你可以看到,10月30日是DST开关的一天。 发生切换AM 2和3之间。 如果我没有记错的话,夏天的时候是UTC + 2,冬季时间为UTC + 1,所以凌晨3点,时钟转身到凌晨2点。

现在,这显然意味着2-3的重叠,但我的测试使用1点和上午10点,这应该是明确的。 我期望即时在10月30日,凌晨1点CEST是因为午夜3600秒,即时在10月30日,上午10点CET是自午夜39600秒(11小时)。 但getSecondOfDay()从午夜开始返回10个小时。

我能想象(除了一个愚蠢的错误)唯一的含义是,getSecondOfDay()实际上并没有因为午夜返回秒,但别的东西。 然而,我在网上找到的每个例子似乎暗示,因为午夜,它返回的秒数。 有“子夜”,我知道没有DST相关的重新定义,无论是。

为什么我得到这些结果? 什么是getSecondOfDay()意味着在这种情况下怎么办? 还有什么我应该做的就是自午夜起的秒数?

Answer 1:

现场SECOND_OF_DAY本质上是根据当地的时间表。 这意味着,自午夜它不计算物理经过SI-或者POSIX秒,但是仅代表时钟罢工的标称数量上的挂钟,它总是有24个小时/天夜周期罢工忽略任何DST-作为显示问题。 或者另一种描述:试想一下,这个字段显示秒针的钟面的位置。

但是你能确定实际经过的秒以另一种方式 。 类DateTime是一个即时的,因此你可以首先确定午夜瞬间接着第二时刻为我们在上午10点说。 然后,在应用此表达式:

int elapsedSecondsSinceMidnight =
  Seconds.secondsBetween(instantMidnight, instant10AM).getSeconds();

需要注意的是乔达时间有时会导致异常创建本地午夜即时如果(移动到夏天的时候,巴西等)这样的本地时间不存在由于DST开关。 所以,请在办理乔达时小心瞬间的创作。



文章来源: Joda Time getSecondOfDay on DST switch day