【问题标题】:Why does adding minutes to 1900-01-01 00:00:00 results in a change in seconds?为什么将分钟添加到 1900-01-01 00:00:00 会导致秒数发生变化?
【发布时间】:2013-10-23 13:02:53
【问题描述】:

我正在开发一个使用 java.util.Date 来保持时间的应用程序。每次获取 1900-01-01 作为日期。该应用程序有一个实用程序类,用于将分钟添加到时间。在 Linux 上,当将 9*60 + 32 = 572 分钟添加到 1900-01-01 00:00:00 其中 1900-01-01 时,我得到 1900-01-01 08:51:32 作为结果09:32:00 是预期的。这种差异怎么可能?

在 Windows 7 或 Linux 1901 或 2013 上不会出现这种差异。

使用 Java 编译/测试:1.6.0_23-b05 和 1.7.0_11-b21
Linux 版本:2.6.18-308.el5 #1 SMP Fri Jan 27 17:17:51 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
时区:CEST

package nl.brandweer.test.calendar;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class CalendarTest {

        public static void main(String[] args) {
                System.out.println("Hello Mars");
                CalendarTest test = new CalendarTest();
                test.test1();
                test.test2();
                test.test3();
        }

        GregorianCalendar myCalendar;

        private void test1() {
                System.out.println("Test 1");
                this.myCalendar = new GregorianCalendar(1900, 0, 1, 0, 0, 0);
                System.out.println("myCalendar: " + myCalendar);
                System.out.println("myCalendar.getTime(): " + myCalendar.getTime());

                addMinutes(572);
                System.out.println("myCalendar.getTime(): " + myCalendar.getTime());
        }

        private void test2() {
                System.out.println("Test 2");
                this.myCalendar = new GregorianCalendar(1901, 0, 1, 0, 0, 0);
                System.out.println("myCalendar: " + myCalendar);
                System.out.println("myCalendar.getTime(): " + myCalendar.getTime());

                addMinutes(572);
                System.out.println("myCalendar.getTime(): " + myCalendar.getTime());
        }

        private void test3() {
                System.out.println("Test 3");
                this.myCalendar = new GregorianCalendar(2013, 0, 1, 0, 0, 0);
                System.out.println("myCalendar: " + myCalendar);
                System.out.println("myCalendar.getTime(): " + myCalendar.getTime());

                addMinutes(572);
                System.out.println("myCalendar.getTime(): " + myCalendar.getTime());
        }

        /**
         * Add minutes to Time.<p>
         * The date stays te same!
         * @param value Minutes
         */
        protected void addMinutes(int value) {
                int year  = getYear();
                int month = getMonth() - 1;
                int day   = getDay();

                this.myCalendar.add(Calendar.MINUTE, value);

                this.myCalendar.set(Calendar.YEAR, year);
                this.myCalendar.set(Calendar.MONTH, month);
                this.myCalendar.set(Calendar.DAY_OF_MONTH, day);
        }

        /**
         * @return The day of month
         */
        public int getDay() {
            return get(Calendar.DAY_OF_MONTH);
        }

        /**
         * @return Month [1..12]
         */
        public int getMonth() {
            return get(Calendar.MONTH) + 1;
        }

        public int getYear() {
            return get(Calendar.YEAR);
        }

        protected int get(int field) {
                return myCalendar.get(field);
        }

}

解决方法是在进行纯时间计算时将年份更改为 1901 或 2013。

更新: 1900 在 Joda-time 实现中使用 Linux 时也会出现同样的错误。

【问题讨论】:

  • This 问题可能会有所帮助。
  • 那些是其他异常。我认为这是一个 RedHat 错误。

标签: java linux datetime


【解决方案1】:

UTC 的时间偏移说明了差距:UTC + 1:39:52h

http://www.timeanddate.com/worldclock/timezone.html?n=101&syear=1900

【讨论】:

  • 将 01:39:52 添加到 08:51:32 会得到 10:31:24(请参阅 unitarium.com/time-calculator),它不等于 09:32:00。 1901 年也没有发生错误,并且提到的偏移量一直持续到 1920 年。我错过了什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多