Java 显示错误的时差
我尝试了许多方法来显示两次之间的差异,但我无法找到解决方案:Java 显示错误的时差,java,date,time,calendar,Java,Date,Time,Calendar,我尝试了许多方法来显示两次之间的差异,但我无法找到解决方案: long strt = System.currentTimeMillis();//1462968291733 Thread.sleep(5000); long end = System.currentTimeMillis();//1462968296733 long diff = end - strt; Calendar calendar = Calendar.getInstance(); calendar.setTimeInMi
long strt = System.currentTimeMillis();//1462968291733
Thread.sleep(5000);
long end = System.currentTimeMillis();//1462968296733
long diff = end - strt;
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(diff);
TimeZone timeZone = TimeZone.getTimeZone("IST");
calendar.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
System.out.println(calendar.getTime());//05:30:05
打印错误的输出:
1970年1月1日星期四05:30:05
输出应该是
1970年1月1日星期四00:00:05
这是因为默认打印输出使用默认区域设置,在您的情况下为
+5:30
您需要按所需时区格式化输出,例如使用SimpleDateFormat
:
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(sdf.format(calendar.getTime()));
这是因为默认打印输出使用默认区域设置,在您的情况下为
+5:30
您需要按所需时区格式化输出,例如使用SimpleDateFormat
:
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(sdf.format(calendar.getTime()));
你正在与时区混淆。请尝试以下操作:
long strt = System.currentTimeMillis();// 1462968291733
Thread.sleep(5000);
long end = System.currentTimeMillis();// 1462968296733
long diff = end - strt;
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(diff);
TimeZone cutsomTimeZone = TimeZone.getTimeZone("IST");
DateFormat formatter = new SimpleDateFormat
("EEE MMM dd HH:mm:ss zzz yyyy");
formatter.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
System.out.println(formatter.format(calendar.getTime()));//
formatter.setTimeZone(cutsomTimeZone);
System.out.println(formatter.format(calendar.getTime()));
首先,正如javadoc所说,System.currentMillis()
返回自1970年1月1日以来UTC中的毫秒数,这显然与IST不同
其次,calendar.getTime()
返回的Date
对象没有时区。通过System.out.println(calendar.getTime())
获得的输出使用系统默认的TimeZone
,它看起来是IST
第三,请不要使用
Date
api,它非常糟糕。如果可能的话,最好选择java.time
一个。你会被时区弄糊涂。请尝试以下操作:
long strt = System.currentTimeMillis();// 1462968291733
Thread.sleep(5000);
long end = System.currentTimeMillis();// 1462968296733
long diff = end - strt;
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(diff);
TimeZone cutsomTimeZone = TimeZone.getTimeZone("IST");
DateFormat formatter = new SimpleDateFormat
("EEE MMM dd HH:mm:ss zzz yyyy");
formatter.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
System.out.println(formatter.format(calendar.getTime()));//
formatter.setTimeZone(cutsomTimeZone);
System.out.println(formatter.format(calendar.getTime()));
首先,正如javadoc所说,System.currentMillis()
返回自1970年1月1日以来UTC中的毫秒数,这显然与IST不同
其次,calendar.getTime()
返回的Date
对象没有时区。通过System.out.println(calendar.getTime())
获得的输出使用系统默认的TimeZone
,它看起来是IST
第三,请不要使用Date
api,它非常糟糕。如果可能的话,最好选择java.time
one.和都是正确的
避免使用旧的日期时间类。在Java8和更高版本中,它们已被框架所取代。对于Java6和Java7,项目已经对大部分功能进行了后移植,并通过项目进一步对Android进行了调整
完全不需要时区来捕获经过的时间
代表UTC时间线上的一个时刻,分辨率高达。在Java 8中,当前时刻的捕获分辨率仅为,但Java 9中的新实现将捕获纳秒,具体取决于计算机的时钟硬件能力
Instant start = Instant.now();
…
Instant stop = Instant.now();
A将时间跨度捕获为整秒的总数,将一秒的一小部分捕获为纳秒。此值未附加到时间线
Duration duration = Duration.between( start , stop );
time类在生成日期时间值的文本表示时使用该标准。在2.5秒的持续时间内,您将获得一个类似于PT2.5S
的值,其中P
标记开始(对于周期),而T
将任何年、月、日和时、分、秒分开。此格式可防止时钟格式的模糊性,其中00:00:02.5
看起来像是一天中午夜过后两分钟的时间。但如果您愿意,您可以询问持续时间
中的数字
String output = duration.toString();
和都是正确的
避免使用旧的日期时间类。在Java8和更高版本中,它们已被框架所取代。对于Java6和Java7,项目已经对大部分功能进行了后移植,并通过项目进一步对Android进行了调整
完全不需要时区来捕获经过的时间
代表UTC时间线上的一个时刻,分辨率高达。在Java 8中,当前时刻的捕获分辨率仅为,但Java 9中的新实现将捕获纳秒,具体取决于计算机的时钟硬件能力
Instant start = Instant.now();
…
Instant stop = Instant.now();
A将时间跨度捕获为整秒的总数,将一秒的一小部分捕获为纳秒。此值未附加到时间线
Duration duration = Duration.between( start , stop );
time类在生成日期时间值的文本表示时使用该标准。在2.5秒的持续时间内,您将获得一个类似于PT2.5S
的值,其中P
标记开始(对于周期),而T
将任何年、月、日和时、分、秒分开。此格式可防止时钟格式的模糊性,其中00:00:02.5
看起来像是一天中午夜过后两分钟的时间。但如果您愿意,您可以询问持续时间
中的数字
String output = duration.toString();
我复制/粘贴你的代码,它在我的环境中工作良好。“实际输出是”你是说“实际输出应该是”吗?我复制/粘贴你的代码,它在我的环境中工作良好。“实际输出是”你是指“实际输出应该是”吗?