我处理一个使用java.util.Date来保存时间的应用程序。每次都得到1900-01-01作为日期。该应用程序有一个实用程序类,用于添加分钟到一个时间。在Linux上,我将1900-01-01 08:51:32 作为结果添加9 * 60 + 32 = 572分钟到1900-01-01 00:00:00其中1900-01-01预计 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 1月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时出现同样的错误。
答案 0 :(得分:0)
UTC的时间偏移占差距:UTC + 1:39:52h
请参阅http://www.timeanddate.com/worldclock/timezone.html?n=101&syear=1900