意外结果从日期03/25/2018开始减去24小时

时间:2018-03-23 10:55:39

标签: java datetime hour java.util.calendar java-date

我正在从GregorianCalendar 03/25/2018 09:41中减去24小时。

结果 03/24/2018 08:41

public class Utiles{
    public static void main(String args[]) {

        SimpleDateFormat sdt = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        GregorianCalendar gcFinAux = new GregorianCalendar(2018, 2, 25, 9, 41, 0);

        System.out.println("1. " + sdt.format(gcFinAux.getTime()));
        gcFinAux.add(Calendar.HOUR_OF_DAY, -24);
        System.out.println("2. " + sdt.format(gcFinAux.getTime()));
    }
}

输出

1. 25/03/2018 09:41:00
2. 24/03/2018 08:41:00

如果我尝试使用其他日期,结果是正确的。

我使用JDK1.6.0_45和Java 1.8在Linux和Windows中尝试。

有人可以确认您是否得到相同的结果?

谢谢。

2 个答案:

答案 0 :(得分:0)

我知道世界上某些地方在特定的24小时内有时间变化。听起来基础逻辑就是考虑到这一点。

答案 1 :(得分:0)

正如评论中所说,你观察到的是今年3月24日至3月25日夜间夏季时间(DST)时间段的预期和正确行为。这包括欧洲大部分地区,包括西班牙,而不是(欧洲部分地区)土耳其和俄罗斯,但也包括格陵兰岛和黎巴嫩(巴拉圭在同一天晚上从夏季开始改变)。

java.time:正如词汇和Zabuza在评论中所说,你真的没有理由要使用SimpleDateFormatGregorianCalendar。那些课程已经过时了,而前者尤其出了名的麻烦。而是使用java.time,现代Java日期和时间API:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss");
    ZonedDateTime zdtFinAux 
            = ZonedDateTime.of(2018, 3, 25, 9, 41, 0, 0, ZoneId.of("Europe/Madrid"));

    System.out.println("1. " + zdtFinAux.format(formatter));
    zdtFinAux = zdtFinAux.minusHours(24);
    System.out.println("2. " + zdtFinAux.format(formatter));

输出与您的输出相同,当然:

1. 25/03/2018 09:41:00
2. 24/03/2018 08:41:00

如果您想要前一天的同一时间,则可以选择使用minusDays(1)代替minusHours(24)

<强>链接