Java.util.Calendar -> Calendar.add() 与夏令时

3
我的服务器设置了“美洲/圣保罗”时区,今年10月21日开始实行夏令时,如果我这样做,为什么会发生什么?
public static void main(String[] args){

    Calendar d1 = new GregorianCalendar(2012, 9, 19, 0, 0, 0);

    Calendar d2 = new GregorianCalendar(2012, 9, 22, 0, 0, 0);

    while(d1.compareTo(d2) <= 0){
        System.out.println("\nBEFORE: " + d1.getTime());
        d1.add(Calendar.DAY_OF_MONTH, 1);
        System.out.println("AFTER: " + d1.getTime());
    }


}

我有以下输出:

BEFORE: Fri Oct 19 00:00:00 BRT 2012

AFTER: Sat Oct 20 00:00:00 BRT 2012

BEFORE: Sat Oct 20 00:00:00 BRT 2012

AFTER: Sun Oct 21 01:00:00 BRST 2012

BEFORE: Sun Oct 21 01:00:00 BRST 2012

AFTER: Mon Oct 22 01:00:00 BRST 2012

当我执行 d1.add(Calendar.DAY_OF_MONTH, 1) 只有日期应该增加而不是时间,对吧?我该如何避免这种情况并保持原始时间,我不想使用GMT-3,我需要知道何时是夏令时。

谢谢!


以下文章将帮助您使用JodaTime API进行操作,获取Java中时区的夏令时转换日期。https://dev59.com/YXM_5IYBdhLWcg3wRw51 - Vishal
1个回答

0

由于圣保罗在21日没有午夜交替,因此21日将从凌晨1点开始。对于22日,您需要添加一天,然后它仍然是凌晨1点,以此类推。为了使其正确,您应该从19日开始添加天数,而不是根据前一天进行计算。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接