Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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_Calendar_Unix Timestamp - Fatal编程技术网

Java 为什么日期转换返回不同的时间戳?

Java 为什么日期转换返回不同的时间戳?,java,date,calendar,unix-timestamp,Java,Date,Calendar,Unix Timestamp,我正在将GregorianCalendar实例转换为日期以获取unix时间戳 但是我想知道为什么同一个日期每次都返回不同的Unix时间戳 SimpleDataFormat sdf=新的SimpleDataFormat(“yyyy/MM/dd HH:MM:ss”); 日历=新的公历日历(); 日历集(2018,0,1,0,0,0); System.out.println(sdf.format(calendar.getTime()); Date=calendar.getTime(); System.

我正在将GregorianCalendar实例转换为日期以获取unix时间戳

但是我想知道为什么同一个日期每次都返回不同的Unix时间戳

SimpleDataFormat sdf=新的SimpleDataFormat(“yyyy/MM/dd HH:MM:ss”);
日历=新的公历日历();
日历集(2018,0,1,0,0,0);
System.out.println(sdf.format(calendar.getTime());
Date=calendar.getTime();
System.out.println(sdf.format(date));
System.out.println(date.getTime());
日期本身是正确的,并且总是相同的,
“2018/01/01 00:00:00”
。但是为什么unix时间戳每次都不同呢?例如,这些是执行5次后的值

1514761200624
1514761200618
1514761200797
1514761200209
1514761200132

创建新日历时,它包含当前日期和时间。之后,更新除毫秒以外的所有字段。由于在所有输出中只能看到最后3个数字不同,所以执行时间为毫秒。

创建新日历时,它包含当前日期和时间。之后,更新除毫秒以外的所有字段。由于您可以看到所有输出中只有最后3个数字不同,所以执行时间为毫秒。

我假设您在示例中实例化了循环中的所有内容

如果是这样,您没有设置毫秒差,因此它们在循环的每个迭代中都会发生变化(尽管变化很小)

为了避免这种情况,您可以设置毫秒,或者在循环之外执行实例化:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar calendar = new GregorianCalendar();
calendar.set(2018, 0, 1, 0, 0, 0);
for (int i = 0; i < 5; i++) {
     System.out.println(sdf.format(calendar.getTime()));
     Date date = calendar.getTime();
     System.out.println(sdf.format(date));
     System.out.println(date.getTime());
}
SimpleDataFormat sdf=新的SimpleDataFormat(“yyyy/MM/dd HH:MM:ss”);
日历=新的公历日历();
日历集(2018,0,1,0,0,0);
对于(int i=0;i<5;i++){
System.out.println(sdf.format(calendar.getTime());
Date=calendar.getTime();
System.out.println(sdf.format(date));
System.out.println(date.getTime());
}
这将产生:

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128


我假设您在示例中实例化了循环中的所有内容

如果是这样,您没有设置毫秒差,因此它们在循环的每个迭代中都会发生变化(尽管变化很小)

为了避免这种情况,您可以设置毫秒,或者在循环之外执行实例化:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar calendar = new GregorianCalendar();
calendar.set(2018, 0, 1, 0, 0, 0);
for (int i = 0; i < 5; i++) {
     System.out.println(sdf.format(calendar.getTime()));
     Date date = calendar.getTime();
     System.out.println(sdf.format(date));
     System.out.println(date.getTime());
}
SimpleDataFormat sdf=新的SimpleDataFormat(“yyyy/MM/dd HH:MM:ss”);
日历=新的公历日历();
日历集(2018,0,1,0,0,0);
对于(int i=0;i<5;i++){
System.out.println(sdf.format(calendar.getTime());
Date=calendar.getTime();
System.out.println(sdf.format(date));
System.out.println(date.getTime());
}
这将产生:

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128


在时间戳中,最后3位数字表示毫秒。在这里,您可以显式地设置日期和时间,而不是毫秒。这就是为什么你要面对这个问题。要避免这种情况,您可以将其添加到代码中:

calendar.set(Calendar.MILLISECOND, 0);

在时间戳中,最后3位数字表示毫秒。在这里,您可以显式地设置日期和时间,而不是毫秒。这就是为什么你要面对这个问题。要避免这种情况,您可以将其添加到代码中:

calendar.set(Calendar.MILLISECOND, 0);
java.time 这将始终提供以下输出:

1514761200000

如果不是欧洲/布鲁塞尔,请替换您想要的时区

要设置输出格式,请执行以下操作:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
    System.out.println(start2018.format(formatter));
2018/01/01 00:00:00

您使用的日期和时间类-
SimpleDateFormat
Calendar
GregorianCalendar
date
,都设计得很差,而且早已过时
SimpleDateFormat
尤其是出了名的麻烦,但在这种情况下,是
Calendar
的糟糕设计给了您意想不到的结果。其他答案已经解释了,我没有必要重复。我建议您使用java.time,即现代的java日期和时间API,而不是旧的类。和你一起工作真是太好了

链接:解释如何使用java.time。

java.time 这将始终提供以下输出:

1514761200000

如果不是欧洲/布鲁塞尔,请替换您想要的时区

要设置输出格式,请执行以下操作:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
    System.out.println(start2018.format(formatter));
2018/01/01 00:00:00

您使用的日期和时间类-
SimpleDateFormat
Calendar
GregorianCalendar
date
,都设计得很差,而且早已过时
SimpleDateFormat
尤其是出了名的麻烦,但在这种情况下,是
Calendar
的糟糕设计给了您意想不到的结果。其他答案已经解释了,我没有必要重复。我建议您使用java.time,即现代的java日期和时间API,而不是旧的类。和你一起工作真是太好了


链接:解释如何使用java.time。

时间戳的最后3位代表毫秒。您设置的时间仅为秒。这就是您看到这种差异的原因。我建议您不要使用
SimpleDateFormat
Date
。正如您的结果所示,这些类设计得很糟糕,而且早已过时,尤其是前者,臭名昭著。改为使用
ZoneDateTime