用毫秒表示的Java时间到底意味着什么?
请需要帮助来理解这个小Java程序,它显示了两个不同值的Java日期用毫秒表示的Java时间到底意味着什么?,java,date,Java,Date,请需要帮助来理解这个小Java程序,它显示了两个不同值的Java日期 Date dateOne = new Date(); long dateOnetime = dateOne.getTime(); long dateTwoTime = dateOnetime / 1000; dateTwoTime *=1000; Date dateTwo = new Date(dateTwoTime); 当使用简单的System.out.println(字符串str)记录这些变量时;我得到: date
Date dateOne = new Date();
long dateOnetime = dateOne.getTime();
long dateTwoTime = dateOnetime / 1000;
dateTwoTime *=1000;
Date dateTwo = new Date(dateTwoTime);
当使用简单的System.out.println(字符串str)记录这些变量时;我得到:
- dateOneTime=1476976051325
- dateTwoTime=1476976051000
- 日期一=日期二=2016年10月20日星期四16:07:31沃特
提前感谢您提供清晰的详细信息。您的两个日期相差不到1秒或1000毫秒(具体来说,相差325毫秒) 当您仅将它们记录到秒精度(小时:分钟:秒-16:07:31)时,它们将显示相同的值。毫秒是(1秒是1000毫秒)
您的两个日期相差不到1秒或1000毫秒 将它们打印为小时:分钟:秒格式时,它们将显示为相同的时间。tl;博士 你截断了分数秒 和这样做一样
Instant.now().truncatedTo( ChronoUnit.SECONDS ).toEpochMilli()
细节
你除以一千,然后再乘以一千,算一次。您有效地截断了日期-时间值中的小数秒,该值定义为自1970年第一刻起的计数(1970-01-01T00:00:00Z
)
您使用的是一个麻烦的旧日期时间类,java.util.date
,现在是遗留的,被java.time类取代
java.time中的等效类是Instant
。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)
要截断任何分数秒,请调用方法,而不是使用数学方法。这使您的代码更加自我记录。日期-时间工作很棘手,所以避免使用自己的解决方案
Instant instantWholeSeconds = instant.truncatedTo( ChronoUnit.SECONDS );
我强烈建议不要将日期时间值作为从-。这使得调试变得困难,因为人类无法从一个很长的整数中辨别日期时间的含义。此外,时代至少随时间而变化。这些计数的粒度也各不相同,不同的系统使用整秒,以及其他数量。所以历元数的计数通常是模棱两可的,容易被误解
但如果您坚持,您可以从即时
中提取历元计数。请记住,计数时以毫秒为单位会导致数据丢失,因为任何纳秒都会被截断
// WARNING: Data-loss. Truncating any nanoseconds.
// CAUTION: Tracking date-time as count-from-epoch is *not* advised.
long millis = instant.toEpochMilli();
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到java.time 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 从哪里获得java.time类
- 后来
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 该项目专门针对Android采用了Three Ten Backport(如上所述)
- 看
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。实际上,日期在毫秒级上存在差异。这就不同了 dateOne和dateTwo实际上并不相等。事实上,您正在使用toString来声明相等,我认为这不是最好的方法,因为toString()没有考虑毫秒差。我建议您使用dateOne.equals(dateTwo)进行比较,如我在这里为您提供的示例所示
public class TestDate {
public static void main (String ...args) {
Date dateOne = new Date();
long dateOneTime = dateOne.getTime();
long dateTwoTime = dateOneTime/1000;
System.out.println(dateOneTime);
System.out.println(dateTwoTime);
long dateThreeTime = dateTwoTime*1000;
dateTwoTime *= 1000;
System.out.println(dateThreeTime);
System.out.println(dateTwoTime);
Date dateTwo = new Date(dateTwoTime);
if(dateOne.equals(dateTwo)) {
System.out.println("Dates are equal");
} else {
System.out.println("Dates are not equal");
}
}
}
因为在日期/时间字符串中只看到秒,而在dateTwoTime中去掉毫秒。以
yyyy-MM-dd'T'HH:MM:ss.SSS
格式打印两者,您将看到差异。好的,谢谢您的回复和澄清。所以显示日期的精确性。谢谢你的回答和一个直接的例子来使用,看看我错过了什么。我认为这是最好的答案。
public class TestDate {
public static void main (String ...args) {
Date dateOne = new Date();
long dateOneTime = dateOne.getTime();
long dateTwoTime = dateOneTime/1000;
System.out.println(dateOneTime);
System.out.println(dateTwoTime);
long dateThreeTime = dateTwoTime*1000;
dateTwoTime *= 1000;
System.out.println(dateThreeTime);
System.out.println(dateTwoTime);
Date dateTwo = new Date(dateTwoTime);
if(dateOne.equals(dateTwo)) {
System.out.println("Dates are equal");
} else {
System.out.println("Dates are not equal");
}
}
}