Java 为什么日期转换返回不同的时间戳?
我正在将GregorianCalendar实例转换为日期以获取unix时间戳 但是我想知道为什么同一个日期每次都返回不同的Unix时间戳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.
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