繁体   English   中英

应用DST更改时add()的java.util.GregorianCalendar问题

[英]java.util.GregorianCalendar issue with add() when applying DST changes

我的要求是根据时间表的频率确定下一个日期。 因此,如果频率为“每天”,且第一个日期为2015年10月25日23:59:59,则下一个截止日期应恰好相隔24小时,即2015年10月26日23:59:59

Calendar.add(int field,int amount)似乎正在处理相同的Eg:

每日频率-calendar.add(Calendar.DATE,1);

每周频率-calendar.add(Calendar.DATE,7);

每月频率-calendar.add(Calendar.MONTH,1);

以下是相同的代码摘要:

public static void main(String[] args) {
        Calendar calendar = new GregorianCalendar();

        for(int i=0;i<10;i++) {
            calendar.add(Calendar.DATE, 1);
            System.out.println(calendar.getTime());
        }
    }

==================================================

Thu Oct 29 17:17:26 IST 2015 -- in all cases diff is 24 hrs
Fri Oct 30 17:17:26 IST 2015
Sat Oct 31 17:17:26 IST 2015
Sun Nov 01 17:17:26 IST 2015
Mon Nov 02 17:17:26 IST 2015
Tue Nov 03 17:17:26 IST 2015
Wed Nov 04 17:17:26 IST 2015
Thu Nov 05 17:17:26 IST 2015
Fri Nov 06 17:17:26 IST 2015

如果每天的频率和服务器处于东部时间(EDT),则使用add()会引起一些异常

自11月1日起,DST设置更改的更改会反映在添加中

public static void main(String[] args) {
        Calendar calendar = new GregorianCalendar();        
        calendar.setTimeZone(TimeZone.getTimeZone("US/Eastern"));

        for(int i=0;i<10;i++) {
            calendar.add(Calendar.DATE, 1);
            System.out.println(calendar.getTime());
        }
    }

-------------------------------------

Wed Oct 28 17:18:14 IST 2015
Thu Oct 29 17:18:14 IST 2015
Fri Oct 30 17:18:14 IST 2015
Sat Oct 31 17:18:14 IST 2015
Sun Nov 01 18:18:14 IST 2015 -- here diff is of 24 + 1 hr
Mon Nov 02 18:18:14 IST 2015
Tue Nov 03 18:18:14 IST 2015
Wed Nov 04 18:18:14 IST 2015 -- else everywhere diff is 24 hours
Thu Nov 05 18:18:14 IST 2015
Fri Nov 06 18:18:14 IST 2015

如果第一个日期是2015年10月25日23:59:59,那么在这种情况下,由于2015年10月31日23:59:59之后,额外的1小时轮班会导致异常,下一个日期是2月2日- 2015 00:59:59

进一步遵守《守则》,发现

// The rest of the fields (week, day or AM_PM fields)
// require time zone offset (both GMT and DST) change
// adjustment.

实际上,服务器位于EDT中,在这里我正在关注I / O关系。 我只是尝试在IST中的本地实例上调试它。

    public static void main(String[] args) {
        Calendar calendar = new GregorianCalendar();

        for(int i=0;i<10;i++) {
            calendar.add(Calendar.DATE, 1);
            System.out.println(calendar.getTime());
        }
    }


Wed Oct 28 08:09:48 EDT 2015
Thu Oct 29 08:09:48 EDT 2015
Fri Oct 30 08:09:48 EDT 2015
Sat Oct 31 08:09:48 EDT 2015
Sun Nov 01 08:09:48 EST 2015
Mon Nov 02 08:09:48 EST 2015
Tue Nov 03 08:09:48 EST 2015
Wed Nov 04 08:09:48 EST 2015
Thu Nov 05 08:09:48 EST 2015
Fri Nov 06 08:09:48 EST 2015

使用库来确保我生成的日期按正确顺序应该是一种可靠的方式。

试试下面的代码。 下面的代码并非简单地在DAY或MONTH中加1。 为了获得正确的结果,它将一天增加毫秒。

    public static void main(String[] args) {
    DateFormat formatter = new SimpleDateFormat("EEE MMM dd hh:mm:ss z yyyy");
    Calendar calendar = Calendar.getInstance();
    formatter.setTimeZone(TimeZone.getTimeZone("US/Eastern"));
    calendar.setTimeInMillis(System.currentTimeMillis());
    long time = calendar.getTimeInMillis();
    for(int i=0;i<10;i++) {
        System.out.println(formatter.format(calendar.getTime()));
        time = time + 86400000; 
        calendar.setTimeInMillis(time);
    }
}

日期的绝对格式可以通过更改以下行来更改-

new SimpleDateFormat("E MMM dd hh:mm:ss z yyyy");

它给出输出-

Di Okt 27 EDT 2015年8月15:59:59
Mi Okt 2015年夏令时28:15:59
Do Okt 29 EDT 2015
Ft Okt 30美国东部夏令时间08 08:15:59
美国东部时间2015年10月31日08:15:59
因此,美国东部时间2015年11月1日07:15:59
Mo十一月02 07:15:59 EST 2015
Di Nov 03 07:15:59 EST 2015
Mi十一月04 07:15:59 EST 2015
2015年11月5日上午07:15:59做

我认为异常是因为当天(10月31日晚上)美国东部夏令时间结束。 由于印度没有夏令时,因此IST不会发生此类问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM