使用Epoch的不同初始日期

时间:2011-04-05 15:20:14

标签: java date timestamp epoch

所有

我正在使用二进制规范,其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的时间,但如果我能帮助它,我宁愿不把这种外部依赖带入其中。

2 个答案:

答案 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或一些可靠的外部库。