SimpleDateFormat增加7个小时?

kmo*_*ort 3 java time date

我正在尝试简单地减去日期并获得奇怪的结果.由于某些原因,当我使用SimpleDateFormat格式化它时,有7个额外的小时差异.

package timedemo;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Timedemo {

    public static void main(String[] args) {
        Date start = new Date(); // time right now
        Date stop = new Date();

        long startTime = start.getTime()-1000; // introduce a second of skew
        long stopTime = stop.getTime();

        SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");

        // First one shows up prior to 1970 epoch. Okay, except for 5 hour variance.
        // Probably a timezone thing, as I'm in EST (-5).
        System.out.println("New date is "+new Date(stopTime - startTime)); 
        System.out.println("Raw Start is "+startTime); // fine
        System.out.println("Raw Stop is  "+stopTime); // fine
        System.out.println("Raw Difference is "+(stopTime-startTime));
        System.out.println("Formatted Start is "+sdf.format(startTime));
        System.out.println("Formatted Stop is  "+sdf.format(stopTime));
        System.out.println("Formatted Difference is "+sdf.format(stopTime-startTime));

    }

}
Run Code Online (Sandbox Code Playgroud)

结果是:

New date is Wed Dec 31 19:00:01 EST 1969
Raw Start is 1418397344360
Raw Stop is  1418397345360
Raw Difference is 1000
Formatted Start is 10:15:44
Formatted Stop is  10:15:45
Formatted Difference is 07:00:01
Run Code Online (Sandbox Code Playgroud)
  • 我以为这是时区的事情,但我在EST(-5),而不是MST(-7).
  • 我怀疑是夏令时,但它是7小时,而不是1小时.
  • 12/24小时差异?12-7 = 5这是我的时区偏移...不知道该怎么做它.
  • 在这一点上有点想法.

为什么最后一行七小时轮班?

Jon*_*eet 8

"12-7 = 5"肯定与问题有关......或者更准确地说,它是"12-5 = 7",即午夜前7个小时是晚上7点.如果您将其格式化为完整日期/时间,您会看到:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Run Code Online (Sandbox Code Playgroud)

哎呀,你可以在第一行看到:"Wed Dec 31 19:00:01 EST 1969" - 19:00是晚上7点,你用格式化hh07.

从根本上说,问题在于你试图将时间上的差异看作是一个时间.我强烈建议你不要这样做.如果你绝对想要那样做(并且差异总是非负的但不到24小时),那么你应该将时区设置SimpleDateFormat为UTC,而HH不是使用hh.但最好使用Joda Timejava.timeJava 8来表示a Duration,即两个时间点之间的差异.Date根本不是适合的数据类型.