用毫秒表示的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

请需要帮助来理解这个小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)记录这些变量时;我得到:

  • dateOneTime=1476976051325
  • dateTwoTime=1476976051000
  • 日期一=日期二=2016年10月20日星期四16:07:31沃特
为什么dateOneTime和dateTwoTime如此不同,但dateTwo和dateOne是一样的


提前感谢您提供清晰的详细信息。

您的两个日期相差不到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");
            }
    }

}