【问题标题】:setGregorianChange(new Date(Long.MIN_VALUE)) does not convert the calendar to pure GregorianCalendarsetGregorianChange(new Date(Long.MIN_VALUE)) 不会将日历转换为纯 GregorianCalendar
【发布时间】:2016-07-27 16:06:02
【问题描述】:
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 

【问题讨论】:

  • 为什么你创建了一个BigDecimal 然后你忽略了?

标签: java offset type-conversion gregorian-calendar dateadd


【解决方案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 转换为字符串不会执行儒略/格里高利转换,而Date 会。

【讨论】:

  • 考虑到它们的起源,我想做的是从 ANSI/UNIXTIMESTAMP 格式到 ISO 格式添加一定的时间。我输入的日期被转换为 UNIXTIMESTAMP/ANSI,我必须将其转换回相同的日期。 TimeZone 和 currentTime 可以忽略。我只需要在某个 ORIGIN 中添加和减去以秒或天为单位的时间。
  • 我不确定您所说的“ANSI/UNIXTIMESTAMP 格式”究竟是什么意思——或者这与您所展示的问题有何关系。我建议您提出一个新问题来证明这一点。
  • 我只是想在上面做的是我想将 -583657 天添加到原点 1600/12/31,时间格式将 1601 年 1 月 1 日 00:00:00 视为天1. 因此,-583657 表示将 -583657days 添加到上述原点后的日期。但是,使用 GeorgianCalendar 我得到 Jan 3, 0003 00:00:00。但是,实际日期是 0003 年 1 月 1 日 00:00:00。 java中的公历是与儒略日期的混合体,即使我根据API将setGregorianChange()设置为上述设置,我也会在减去天数的同时得到某些偏移量以转换为预想的。你能建议我一个更好的方法吗?
  • @1234jkl:但是您的代码没有转换为 ISO 格式。如果您使用相同的公历日历创建另一个SimpleDateFormat,我希望您能得到正确的结果。但是你从来没有在你的问题中问过这个问题——因此我建议你问一个新问题,详细说明你真正想要做什么。这不应该出现在 cmets 中,你也不应该改变它的问题。
猜你喜欢
  • 2013-03-02
  • 1970-01-01
  • 2023-03-30
  • 2018-08-14
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 2019-08-24
  • 2021-09-19
相关资源
最近更新 更多