我需要解析一个自定义日期格式,在我需要通知的设备中定义,其中日期是从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日?如果不可能,我可以使用其他类而不是自己创建所有代码吗?
提前致谢。
答案 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