【问题标题】:Java , adding minutes to a Date , weird anomalyJava,向 Date 添加分钟,奇怪的异常
【发布时间】:2023-04-02 10:43:02
【问题描述】:

在 Windows 和 Ubuntu Linux 上使用 Java 版本 1.5.0_06:

每当我在 "2008/10/05 00:00:00" 日期上添加分钟时,似乎错误地添加了一个额外的小时。

即:在 2008 年 10 月 5 日午夜 00:00:00 加上 360 分钟应到达 2008/10/05 06:00:00

但它是在 2008/10/05 07:00:00 到达的

完全令人困惑的是,这发生在 2008 年 10 月 5 日这一天,我尝试正确执行分钟加法的所有其他日子。

我是疯了还是这是 Java 中的一个错误?

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

    try {
        String date = "2008/10/05 00:00:00";
        int minutesToAdd = 360;  // 6 hrs

        Calendar cal = Calendar.getInstance();
        cal.setTime(sdf.parse(date));
        cal.add(Calendar.MINUTE, minutesToAdd);
        System.out.println(cal.getTime());

    } catch (ParseException e) {}

【问题讨论】:

    标签: java date


    【解决方案1】:

    那天是夏令时的交叉点。

    你在新西兰吗?如果是这样,这意味着您的时区文件已过时。最好去Java下载站点下载新的;寻找“JDK DST 时区更新工具”。

    【讨论】:

    • 嘿嘿嘿,对!无论如何,我对新西兰的评论是这样的,截至去年,夏令时已从 10 月的第一个星期日移至 9 月的最后一个星期日。由于 Java 5 已经存在了一段时间,因此区域文件可能确实需要更新。
    【解决方案2】:

    这可能是夏令时开始吗?

    【讨论】:

      【解决方案3】:

      看看Joda-Time

      来自文档:

      “创建 Joda-Time 是为了从根本上改变 Java 中的日期和时间处理方式。JDK 类 Date 和 Calendar 的设计非常糟糕,存在许多错误并且具有奇怪的性能影响。”

      【讨论】:

        【解决方案4】:

        java.time

        我建议您使用现代 Java 日期和时间 API java.time 来处理您的日期和时间工作(您曾在 2008 年报告过使用 Java 1.5,在 java.time 出现之前,但我希望您是不再)。 java.time 可以被认为是 Willi aus Rohr 在他的回答中提到的 Joda-Time 库的继承者。

        让我们首先定义一个用于解析的格式化程序:

        private static final DateTimeFormatter PARSER
                = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss", Locale.ROOT);
        

        现在解析您的字符串并添加 360 分钟:

            String date = "2008/10/05 00:00:00";
            int minutesToAdd = 360;  // 6 hrs
            
            ZonedDateTime originalTime = LocalDateTime.parse(date, PARSER)
                    .atZone(ZoneId.of("Pacific/Auckland"));
            ZonedDateTime newTime = originalTime.plusMinutes(minutesToAdd);
            
            System.out.println(newTime);
        

        我的 Java 11 上的输出:

        2008-10-05T06:00+13:00[太平洋/奥克兰]

        已正确添加 6 小时。您注意到ZonedDateTime 还打印了它的 UTC 偏移量,这里是 +13:00,所以如果您的 Java 安装中有一个过时的时区数据库,您也有机会看到偏移量不是预计。

        如果您想添加整小时,请首选plusHours 方法而不是plusMinutes

        链接

        Oracle tutorial: Date Time 解释如何使用 java.time。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-08-12
          • 1970-01-01
          • 2011-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多