【问题标题】:Unexpected result subtracting 24 hours from date 03/25/2018意外结果从 2018 年 3 月 25 日减去 24 小时
【发布时间】:2018-09-02 00:53:26
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 是的,夏令时是真实的。如果您不喜欢,请在此请愿书上签名:change.org/p/…
  • 考虑切换到java.time。让事情变得更容易。
  • 您使用的日期 API 是 legacy。请改用 java.time 包的类。
  • 噢噢!!!!大错误。对不起。谢谢大家。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

        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)

    链接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      相关资源
      最近更新 更多