应用DST更改时,java.util.GregorianCalendar与add()一起出现问题

应用DST更改时,java.util.GregorianCalendar与add()一起出现问题,java,date,calendar,Java,Date,Calendar,我的要求是根据日程安排的频率确定下一个日期。 因此,如果频率为每日,第一个日期为2015年10月25日23:59:59, 下一个决斗日期应该正好相隔24小时,即2015年10月26日23:59:59 日历。添加(整数字段,整数金额)似乎正在处理相同的问题 例如: 每日频率——calendar.add(calendar.DATE,1) 每周频率——calendar.add(calendar.DATE,7) 每月频率——calendar.add(calendar.MONTH,1) 以下是该文件的代码

我的要求是根据日程安排的频率确定下一个日期。 因此,如果频率为每日,第一个日期为2015年10月25日23:59:59, 下一个决斗日期应该正好相隔24小时,即2015年10月26日23:59:59

日历。添加(整数字段,整数金额)似乎正在处理相同的问题 例如:

每日频率——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中,在这里我得到以下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
publicstaticvoidmain(字符串[]args){
日历=新的公历日历();

对于(int i=0;i请尝试下面的代码。下面的代码不会简单地将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);
    }
}
它给出了输出-

2015年美国东部夏令时27时08分15分59分 密歇根州东部时间2015年8月28日08:15:59
美国东部时间2015年8月29日08:15:59执行任务
法国东部时间2015年8月30日08:15:59
南非东部时间2015年8月31日08:15:59
因此,美国东部时间2015年11月1日07:15:59
美国东部时间2015年11月2日上午7:15:59
美国东部时间2015年11月3日07:15:59
密歇根州东部时间2015年11月4日07:15:59

执行2015年11月5日07:15:59东部标准时间

尝试以下代码。以下代码不会简单地将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);
    }
}
它给出了输出-

2015年美国东部夏令时27时08分15分59分 密歇根州东部时间2015年8月28日08:15:59
美国东部时间2015年8月29日08:15:59执行任务
法国东部时间2015年8月30日08:15:59
南非东部时间2015年8月31日08:15:59
因此,美国东部时间2015年11月1日07:15:59
美国东部时间2015年11月2日上午7:15:59
美国东部时间2015年11月3日07:15:59
密歇根州东部时间2015年11月4日07:15:59

Do Nov 05 07:15:59 EST 2015

我认为异常是因为那天(10月31日晚上)EDT区域的白天即将结束。
IST没有出现这样的问题,因为印度没有夏时制。

我认为这种异常是因为,EDT区域的白天(10月31日晚上)结束了。
IST没有出现这样的问题,因为印度没有夏令时。

目前使用java7:(顺便说一句,您能否详细说明java 8如何解决相同的问题,因为我对same几乎不了解。我认为代码与我的观点一样好。您试图调试IST时区,而您已经将其设置为EST。目前使用java7:(顺便说一句,你能详细说明一下java 8是如何解决这个问题的吗?我对same几乎一无所知。我认为代码和我的观点一样好。你试图调试IST时区,而你已经将它设置为EST。你能将它的时区设置为EST calendar.setTimeZone(timezone.getTimeZone(“US/Eastern”));我认为您可以添加这一行-calendar.setTimeZone(TimeZone.getTimeZone(“US/Eastern”);您可以这样将时区设置为格式化程序。在该cae中,您将在所需的时区中得到结果…formatter.setTimeZone(TimeZone.getTimeZone(“US/Eastern”);您可以将其时区设置为EST calendar.setTimeZone吗(TimeZone.getTimeZone(“US/Eastern”);我认为您可以添加这一行-calendar.setTimeZone(TimeZone.getTimeZone(“US/Eastern”);您可以像这样将时区设置为格式化程序。在该cae中,您将在所需的时区中得到结果…formatter.setTimeZone(TimeZone.getTimeZone(“US/Eastern”);
    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");