使用GregorianCalendar作为自定义日期格式

时间:2012-12-13 10:13:20

标签: java date gregorian-calendar

我需要解析一个自定义日期格式,在我需要通知的设备中定义,其中日期是从2000年开始计算的秒数。

我尝试使用GregorianCalendar来解析这些数据,这是我尝试过的代码:

    GregorianCalendar calendar = new GregorianCalendar();
    calendar.setGregorianChange(new Date(2000 - 1900, 0, 1));

Date对象对应于2000年1月1日。我认为有了这个,我可以setTimeInMillis得到正确的日期乘以我读1000的时间,因为它是以秒为单位计算,而不是以毫秒为单位GregorianCalendar,但它不起作用。我试过setTimeInMillis(0),等待与calendar相对应的时间对应于2000年1月1日但不是,它对应于1969年12月18日。

如何配置GregorianCalendar以便我可以setTimeInMillis(0)并且它对应于2000年1月1日?如果不可能,我可以使用其他类而不是自己创建所有代码吗?

提前致谢。

5 个答案:

答案 0 :(得分:2)

创建一个日期到2000/01/01并以毫秒为单位获取时间,然后从设备获取时间(以毫秒为单位)。添加这两个并创建日期和日历到你的心愿...

答案 1 :(得分:2)

setGregorianChange只会改变从Julian到Gregorian的转换时间。它默认为正确的历史值。

但由于其他所有人都使用了预感格里高利,因此该函数有一个有效的用例:

setGregorianChange(new Date(Long.MIN_VALUE)) //Julian never happened

这也是JodaTime默认使用的。

无论如何,您可以从正常的毫秒unix时间戳中减去946684800000L,并除以1000:

public static long secondsSince2000(Date input) {
    final long epoch = 946684800000L;
    return (input.getTime() - epoch) / 1000L;
}

从2000年以来的秒数转换:

public static Calendar fromSecondsSince2000( long seconds ) {
    final long epoch = 946684800000L;
    Calendar cal = GregorianCalendar.getInstance();
    long timestamp = epoch + seconds * 1000L;
    cal.setTime(new Date(timestamp));
    return cal;
}

要看两者都有效:

    long sec = secondsSince2000(new Date());
    Calendar cal = fromSecondsSince2000( sec );
    System.out.println(cal.getTime().toString().equals(new Date().toString()));

他们应该打印true

答案 2 :(得分:1)

您正在使用Date的弃用构造函数。而且,你错误地使用它。

应该是     GregorianCalendar(年份+ 1900,月份,日期)。 根据{{​​3}}

BTW为什么不使用Oracle Docs? 然后你得到了许多方便的东西:

DateTime dt = new DateTime(year, monthOfYear, dayOfMonth, hourOfDay, minuteOfHour);

答案 3 :(得分:0)

您要做的是更改Epoch,默认为2000/01/01(Unix时间戳)。 所以你想拥有的只是一个2000年1月1日作为Epoch的Unix时间戳。

我会得到2000/01/01毫秒的unix时间戳并将其保存为常量。现在,继承GregorianCalendar,以便您可以从输入数据中添加这些millis并返回正确的日期。

也许您也可以查看JSR-310

答案 4 :(得分:0)

这样做

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles")); // change the timezone as you wish
cal.set(Calendar.YEAR, 2000);
cal.set(Calendar.MONTH, 0);
cal.set(Calendar.DATE, 1);   
cal.set(Calendar.HOUR, 00);
cal.set(Calendar.MINUTE, 00);
cal.set(Calendar.SECOND, 00);
cal.set(Calendar.MILLISECOND, 00);

cal.add(Calendar.MILLISECOND, 1000); // calculate and add your millisec here where 1000 is added