2016-07-27 24 views
-1
GregorianCalendar test= new GregorianCalendar(); 
BigDecimal coef=new BigDecimal(-2113480800); 
test.setGregorianChange(new Date(Long.MIN_VALUE)); 
test.set(Calendar.DAY_OF_MONTH, 31); 
test.set(Calendar.MONTH, 11); 
test.set(Calendar.YEAR, 1600); 
test.add(Calendar.DAY_OF_MONTH,-583657); 
System.out.println((test.getTime())); 

// I should get Jan 1 0003 but i get 03 jan 0003 OFFSET of 2 
+1

为什么你创建了一个'BigDecimal',然后忽略它? –

回答

1

您正在使用的日历是罚款 - 你只需要记住一个Date店的时间瞬间。它不记得日历,时区或文本格式。

你得到的Date值是正确的 - 它具有-62072462953058的纪元毫秒,对应于0003-01-01T17:10:46Z(至少对我来说 - 取决于你运行代码的时间)在不使用格里高利变化的系统中。

但是,Date.toString()格式那一刻如果有格里高利的变化,导致两天的抵消。

您可以通过使用Java 8的Instant而不是看到这一点:

import java.time.*; 
import java.util.*; 

public class Test { 
    public static void main (String args[]) { 
     GregorianCalendar test = new GregorianCalendar(); 
     test.setGregorianChange(new Date(Long.MIN_VALUE)); 
     test.set(Calendar.DAY_OF_MONTH, 31); 
     test.set(Calendar.MONTH, 11); 
     test.set(Calendar.YEAR, 1600); 
     test.add(Calendar.DAY_OF_MONTH,-583657); 
     Date date = test.getTime(); 
     Instant instant = Instant.ofEpochMilli(date.getTime()); 
     System.out.println(date); 
     System.out.println(instant); 
    } 
} 

输出(目前,在伦敦):

Wed Jan 03 17:15:26 GMT 3 
0003-01-01T17:15:26.913Z 

两个值表示同一时间点,但Instant转换为字符串不会执行Julian/Gregorian转换,而Date会转换为字符串。

+0

我想要做的是从ANSI/UNIXTIMESTAMP格式添加一定的时间到ISO格式考虑他们的起源。我输入的日期被转换为UNIXTIMESTAMP/ANSI,我必须将它转换回相同的日期。 TimeZone和currentTime可以忽略。我只需要在几秒或几天内加减一些ORIGIN的时间。 – 1234jkl

+0

我不确定你的意思是“ANSI/UNIXTIMESTAMP格式” - 或者它与你显示的问题有什么关系。我建议你问一个可以证明这一点的新问题。 –

+0

我只是想在上面做的是,我想添加-583657天到原始1600/12/31,1601年1月1日00:00:00的时间格式为第1天。因此,-583657会意思是在上述原点加上-583657天后的日期。但是,使用格鲁吉亚日历我得到Jan 3,0003 00:00:00。但是,实际日期是1月1日0003 00:00:00。 java中的公历日历是与Julian日期的混合体,即使我根据API将setGregorianChange()设置为根据要转换为proleptic的API,我也会得到一定的偏移量,同时减去天数。你能告诉我一个更好的方法吗? – 1234jkl