0

我从 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

如果我尝试另一个日期,结果是正确的。

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

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

谢谢你。

4

2 回答 2

0

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

java.time:正如 lexicore 和 Zabuza 在评论中所说,你真的没有理由要使用SimpleDateFormatand GregorianCalendar。这些课程早已过时,而前者尤其是出了名的麻烦。而是使用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).

链接

于 2018-03-24T05:57:12.753 回答
0

我知道世界上某些地方在特定的 24 小时期间会发生时间变化。听起来底层逻辑正在考虑这一点。

于 2018-03-23T10:58:27.760 回答