Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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_Time_Calendar - Fatal编程技术网

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();

我复制/粘贴你的代码,它在我的环境中工作良好。“实际输出是”你是说“实际输出应该是”吗?我复制/粘贴你的代码,它在我的环境中工作良好。“实际输出是”你是指“实际输出应该是”吗?