gpt4 book ai didi

java - 为什么将分钟添加到 1900-01-01 00 :00:00 results in a change in seconds?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:41 25 4
gpt4 key购买 nike

我开发的应用程序使用 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 for 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。

更新:在 Joda 时间实现中使用 Linux 的 1900 会发生相同的错误。

最佳答案

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

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

关于java - 为什么将分钟添加到 1900-01-01 00 :00:00 results in a change in seconds?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19542461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com