Java setGregorianChange(新日期(Long.MIN_值))不会将日历转换为纯GregorianCalendar

Java setGregorianChange(新日期(Long.MIN_值))不会将日历转换为纯GregorianCalendar,java,offset,type-conversion,gregorian-calendar,dateadd,Java,Offset,Type Conversion,Gregorian Calendar,Dateadd,您使用的日历很好-您只需记住,日期只存储时间上的一个瞬间。它不记得日历、时区或文本格式 您得到的Date值是正确的-它的历元毫秒为-62072462953058,对应于0003-01-01T17:10:46Z(至少对我来说,这取决于您运行代码的时间),在一个不使用格里高利变化的系统中 但是,Date.toString()将该瞬间的格式设置为好像存在公历变化,从而导致两天的偏移量 您可以通过使用Java 8的Instant来看到这一点: GregorianCalendar test= new Gr

您使用的日历很好-您只需记住,
日期
只存储时间上的一个瞬间。它不记得日历、时区或文本格式

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

但是,
Date.toString()
将该瞬间的格式设置为好像存在公历变化,从而导致两天的偏移量

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

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 
产出(目前在伦敦):


这两个值表示相同的时间点,但转换为字符串的
即时
不会执行朱利安/格里高利转换,而
Date
确实如此。

为什么要创建一个
bigdecime
,然后忽略它?我想做的是,考虑到它们的来源,将特定时间从ANSI/UNIXTIMESTAMP格式添加到ISO格式。我获取的输入日期被转换为UNIXTIMESTAMP/ANSI,我必须将其转换回相同的日期。时区和当前时间可以忽略。我只需要在某个原点上加上或减去时间(以秒或天为单位)。我不确定“ANSI/UNIXTIMESTAMP格式”到底是什么意思,也不确定这与您显示的问题有什么关系。我建议你问一个新问题来证明这一点。我只是想在上面做的是,我想在1600/12/31的原点上加上-583657天,时间格式将1601年1月1日00:00:00视为第一天。因此,-583657表示将-583657天添加到上述原点之后的日期。但是,使用GeorgianCalendar,我得到了3000年1月3日00:00:00。但是,实际日期是0003年1月1日00:00:00。java中的公历是朱利安日期的混合体,我在减去天数时会得到某些偏移量,即使我根据API将setGregorianChange()设置为上述转换为proleptic日期。你能给我一个更好的方法吗?@1234jkl:但是你的代码没有转换成ISO格式。如果您使用相同的公历创建另一个
SimpleDateFormat
,我希望您得到正确的结果。但是你从来没有在你的问题中问过这个问题——因此我建议你问一个新问题,详细说明你真正想做什么。这不应该出现在评论中,你也不应该因此而改变问题。
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