2013-10-23 65 views
1

我在使用java.util.Date保存時間的應用程序上工作。每次獲得1900-01-01作爲日期。該應用程序有一個實用程序類用於添加分鐘到一個時間。在Linux上,我得到1900-01-01 08:51:32,因爲在1900-01-01 00:00:00加上9 * 60 + 32 = 572分鐘的結果,其中1900-01-01 09:32: 00預計。這種差異可能如何?爲什麼將分鐘添加到1900-01-01 00:00: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週五01月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時間實現中1900與Linux相同的錯誤發生。

+1

[這](http://stackoverflow.com/questions/16409554/30-minute- java中的錯誤日期計算 - 僅限於1900年)問題可能會有所幫助。 – devnull

+0

那些是其他異常情況。我認爲這是一個RedHat錯誤。 –

回答

相關問題