Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为历元使用不同的初始日期_Java_Date_Timestamp_Epoch - Fatal编程技术网

Java 为历元使用不同的初始日期

Java 为历元使用不同的初始日期,java,date,timestamp,epoch,Java,Date,Timestamp,Epoch,全部, 我正在使用一个二进制规范,其时间戳字段定义为“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; da

全部,

我正在使用一个二进制规范,其时间戳字段定义为“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;
}
publicstaticfinaltimezone UTC=TimeZone.getTimeZone(“UTC”);
公共静态最终日历Y2K_EPOCH=Calendar.getInstance(UTC);
静止的{
Y2K_时代。清除();
//月份以0为基础;日期以1为基础。重置时间为2000年1月1日的第一秒
Y2K_历元集(2000,0,1,0,0,0);
}
公共静态最终长MS_介于_原始_EPOCH_和_Y2K_EPOCH=Y2K_EPOCH.getTimeInMillis()之间;
公共静态长GetMillisSecondssincey2k(日期){
long time=date.getTime();
if(原始纪元和Y2K纪元之间的时间<毫秒){
抛出新的IllegalArgumentException(“日期必须在2000年1月1日之后”);
}
返回时间-原始纪元和Y2K纪元之间的毫秒;
}
我的问题是,这是在标准Java日期对象和该数据类型之间进行转换的正确方法吗?有更好的方法吗?我知道乔达的时间,但如果我能帮上忙的话,我宁愿不把这种外部依赖带进来。

看起来不错

请注意,您可以更改

long time = date.getTime();
if (time < MS_BETWEEN_ORIGINAL_EPOCH_AND_Y2K_EPOCH)
    ...
关于您对闰秒的担忧,以下是文档摘录:

尽管Date类旨在反映协调世界时(UTC),但根据Java虚拟机的主机环境,它可能无法准确反映协调世界时。几乎所有现代操作系统都假设在所有情况下1天=24×60×60=86400秒。然而,在UTC中,大约每一两年会有一次额外的秒,称为“闰秒”。闰秒总是作为一天的最后一秒添加,并且总是在12月31日或6月30日。例如,由于增加了闰秒,1995年的最后一分钟长达61秒。大多数计算机时钟不够精确,无法反映闰秒的区别


时间是一个棘手的烂摊子,特别是UTC时间。假设您想要一个基于任意历元的非常好的时间,像您所做的那样简单的减法应该可以。如果您担心闰秒精度,我强烈建议您使用Joda或一些可靠的外部库。

有什么比简单的减法更好?我不是指涉及的操作员太多,我的意思是,我会不会对闰秒等进行调整。通过天真地进行这种计算,我不会依赖闰秒的支持。现有代码通常假定GMT=UTC。例如“Joda Time不支持闰秒。通过编写一个新的、专门的年表,或者对现有的ZonedTimeology类进行一些增强,可以支持闰秒。在这两种情况下,Joda Time的未来版本默认情况下都不会启用闰秒。大多数应用程序都不需要它,而且它可能会带来额外的性能成本。“来自@aioobe:我可能用词不对;我想说的是,在你关心精度的时候,最好使用一个专门处理这类事情的库。如果我引入一个新的日期对象,是的。我没有看到在方法之前使用日历的任何日期
。但我喜欢这个,它当然更具可读性,所以我想我会介绍这个领域。
if (date.before(Y2K_EPOCH))
    ...