所有
我正在使用二进制规范,其TimeStamp字段定义为“自UTC时间2000年1月1日起的毫秒数”。我正在做以下计算:
public static final TimeZone UTC = TimeZone.getTimeZone("UTC") ;
public static final Calendar Y2K_EPOCH = Calendar.getInstance(UTC);
static {
Y2K_EPOCH.clear();
// Month is 0 based; day is 1 based. Reset time to be first second of January 1, 2000
Y2K_EPOCH.set(2000, 0, 1, 0, 0, 0);
}
public static final long MS_BETWEEN_ORIGINAL_EPOCH_AND_Y2K_EPOCH = Y2K_EPOCH.getTimeInMillis();
public static long getMillisecondsSinceY2K(Date date) {
long time = date.getTime();
if (time < MS_BETWEEN_ORIGINAL_EPOCH_AND_Y2K_EPOCH) {
throw new IllegalArgumentException("Date must occur after January 1, 2000");
}
return time - MS_BETWEEN_ORIGINAL_EPOCH_AND_Y2K_EPOCH;
}
我的问题是,这是在标准Java Date对象和此数据类型之间进行转换的正确方法吗?有没有更好的方法呢?我知道Joda的时间,但如果我能帮助它,我宁愿不把这种外部依赖带入其中。
答案 0 :(得分:1)
对我来说很好。
请注意,您可以更改
long time = date.getTime();
if (time < MS_BETWEEN_ORIGINAL_EPOCH_AND_Y2K_EPOCH)
...
到
if (date.before(Y2K_EPOCH))
...
关于您对闰秒的担忧,以下是文档的摘录:
虽然Date类旨在反映协调世界时(UTC),但它可能不会完全这样做,具体取决于Java虚拟机的主机环境。几乎所有现代操作系统都假设在所有情况下1天= 24×60×60 = 86400秒。然而,在UTC中,每年或每两年大约有一次,称为“闰秒”。闰秒总是作为当天的最后一秒添加,并且始终在12月31日或6月30日。例如,由于增加了闰秒,1995年的最后一分钟长61秒。大多数计算机时钟都不够精确,无法反映闰秒的区别。
答案 1 :(得分:0)
时间是一个棘手的混乱,特别是UTC时间。假设你想要一个基于任意时期的美好时光,像你所做的那样简单的减法应该没问题。如果您担心闰秒精度,我强烈建议您使用Joda或一些可靠的外部库。