【问题标题】:java.util.GregorianCalendar issue with add() when applying DST changes应用 DST 更改时 add() 的 java.util.GregorianCalendar 问题
【发布时间】:2015-10-27 11:53:52
【问题描述】:

我的要求是根据日程安排的频率确定下一个日期。 所以如果频率是 DAILY 并且第一个日期是 25-Oct-2015 23:59:59, 下一个截止日期应该正好相隔 24 小时,即 26-Oct-2015 23:59:59

Calendar.add(int field, int amount) 似乎在处理同样的事情 例如:

每日频率 -- 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

如果 DAILY 频率和服务器位于东部时间 (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,在这种情况下,额外的 1 小时班次会导致异常,如下所示 2015 年 10 月 31 日 23:59:59, 下一个日期是 2-Nov-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

什么应该是使用库的可靠方法来确保我生成的日期按正确的顺序。

【问题讨论】:

  • 目前坚持使用 java7 :( 顺便说一句,您能否详细说明 java 8 如何解决问题,因为我对此一无所知
  • 我认为代码在我看来很好。您尝试调试为 IST 时区,而您已经将其设置为 EST。

标签: java date calendar


【解决方案1】:

试试下面的代码。下面的代码不会简单地将 1 添加到 DAY 或 MONTH。为了得到正确的结果,它增加了一天的毫秒数。

    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 08:15:59 EDT 2015
Mi Okt 28 08:15:59 EDT 2015
Do Okt 29 08:15:59 EDT 2015
Fr Okt 30 08:15:59 EDT 2015
Sa Okt 31 08:15:59 EDT 2015
所以 2015 年 11 月 1 日 07:15:59 EST
Mo Nov 02 07:15:59 EST 2015
Di Nov 03 07:15:59 EST 2015
Mi Nov 04 07:15:59 EST 2015
2015 年 11 月 5 日 07:15:59 EST

【讨论】:

  • 你能把它的时区设置为 EST calendar.setTimeZone(TimeZone.getTimeZone("US/Eastern"));
  • 我想你可以简单地添加这一行 - calendar.setTimeZone(TimeZone.getTimeZone("US/Eastern"));
  • 您也可以像这样将时区设置为格式化程序。在这种情况下,您将获得所需时区的结果... formatter.setTimeZone(TimeZone.getTimeZone("US/Eastern"));
【解决方案2】:

我认为异常是因为那天(10 月 31 日晚上)美国东部夏令时区的日光即将结束。 IST 不会出现此类问题,因为印度没有夏令时。

【讨论】:

    猜你喜欢
    • 2017-07-09
    • 2015-01-11
    • 2011-08-23
    • 2015-01-06
    • 2019-04-06
    • 2016-02-19
    • 2015-06-07
    • 2013-03-05
    • 1970-01-01
    相关资源
    最近更新 更多