3

全部,

我正在使用二进制规范,其时间戳字段定义为“自 2000 年 1 月 1 日 UTC 时间以来的毫秒数”。我正在做以下计算:

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 时间,但如果我能提供帮助,我宁愿不引入外部依赖。

4

2 回答 2

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 秒。大多数计算机时钟不够准确,无法反映闰秒的区别。

于 2011-04-05T15:25:13.053 回答
0

时间是一个棘手的问题,尤其是 UTC 时间。假设您想要一个基于任意时期的美好时光,那么像您所做的那样简单的减法应该没问题。如果您担心闰秒精度,我强烈建议您使用 Joda 或一些可靠的外部库。

于 2011-04-05T15:26:01.490 回答