2014-12-12 3 views
3

Я пытаюсь сделать простое вычитание дат и получение нечетных результатов. По какой-то причине, когда я отформатирую его с помощью SimpleDateFormat, разница в 7 дополнительных часов.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)); 

    } 

} 

И результаты:

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 
  • Я думал, что это была временная зона вещь, но я в EST (-5), не MST (-7).
  • Я бы предположил, что летние сбережения, но это 7 часов, а не 1.
  • 12/24 час разница? 12-7 = 5, который является моим временным смещением ... не уверен, что с этим делать.
  • Вид идеи на этом этапе.

Почему семичасовая смена на последней строке?

+0

Возможный дубликат [Вычисление разницы между двумя экземплярами даты Java] (http://stackoverflow.com/questions/1555262/calculating-the-difference-between-two-java-date-instances) –

+0

@BasilBourque Их вопрос было «как я делаю XYZ?» Мой был «почему этот вывод выглядит странно?» Ответ один и тот же, но сам вопрос другой. Я предполагаю, что люди, которые совершают ту же глупую ошибку, что и я, будут легче найти ответ, если он сохранится. Но в любом случае, не беспокойтесь. :-) – kmort

ответ

8

«12-7 = 5» определенно связано с проблемой ... или более точно, это «12-5 = 7», т. Е. За 5 часов до полуночи - 7 вечера. Вы увидите, что если вы отформатировать его в качестве полной даты/времени:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

Heck, вы можете увидеть, что в первой строке: «Ср Дек 31 19:00:01 EST 1969» - это 19: 00 - 7 вечера, которые вы форматируете с использованием hh как 07.

По сути, проблема заключается в том, что вы пытаетесь лечить разницы во время, как если бы это точка во время. Я очень сильно призываю вас не делать этого. Если вы абсолютно хотите это сделать (и разница всегда будет неотрицательной, но не более 24 часов), то вы должны установить часовой пояс на SimpleDateFormat по UTC и использовать HH вместо hh. Но было бы лучше использовать Joda Time или java.time из Java 8, который может представлять Duration, то есть разницу между двумя точками во времени. Date для этого не является подходящим типом данных.

+0

Продолжительность - это именно то, что я искал. Спасибо, Джон. – kmort

Смежные вопросы