2015-09-25 3 views
2

У меня есть эти две строки в качестве входных строкSimpleDateFormatter возвращает два разных часовых поясов

03/12/16 
03/14/16 

Я делаю одного SimpleDateFormatter объект, чтобы получить разницу дат, как этот

DateFormat formatter = new SimpleDateFormat("MM/dd/yy",Locale.US); 
Date dateChkIn = formatter.parse("03/12/16"); 
System.out.println("Checkin date at nights check - "+dateChkIn.toString()); 
Date dateChkOut = formatter.parse("03/14/16"); 
System.out.println("Checkout date at nights check - "+dateChkOut.toString()); 
Long numberOfNghtsCalc = ((dateChkOut.getTime() - dateChkIn.getTime())/86400000L); 
System.out.println("number of nigts calculated - "+ numberOfNghtsCalc); 

Ниже мой выход на сервере

Checkin date at nights check - Sat Mar 12 00:00:00 EST 2016 
Checkout date at nights check - Mon Mar 14 00:00:00 EDT 2016 
number of nigts calculated - 1 

Оценка: ected выход числа nigts вычисленного - 2 Пожалуйста, обратите внимание на две различные временных зоны, которые вернулись из форматере

Обновление: 13-Mar-2016 рассматриваются как DST меняющейся дата. Поэтому мой расчет становится неправильным. (Разделить на 86400000L)

+0

Start либо с помощью Java-8 в Time API или JodaTime вычислить разницу между датами ... вам удалось пересечь границу дневного сбережения? – MadProgrammer

+0

@MadProgrammer Я ценю ваш комментарий. Но моя система использует Java 1.5. Этот код находится в моей рабочей среде. Все это время; он работал отлично. Внезапно это произошло. –

+1

Ну, Joda-Time поддерживает Java 5, но вы даже можете использовать 'Calendar' – MadProgrammer

ответ

2

Я нашел решение. Я узнал, что лучшим решением будет использование Joda Time. Но с наименьшим изменением в существующем коде, я думаю, этот сложный путь будет лучше. Измените этот ответ, если увидите какие-либо недостатки.

List<Date> dates = new ArrayList<Date>(); 
    Calendar calendar = new GregorianCalendar(); 
    calendar.setTime(dateChkIn); 

    Date result = null; 
    while (calendar.getTime().before(dateChkOut)){ 
      result = calendar.getTime(); 


      dates.add(result); 
      calendar.add(Calendar.DATE, 1); 
    } 
    System.out.println("DAYS CALCULATED BY NEW SOLUTION: " + dates.size()); 
    newNumberOfNghtsCalc = (long) dates.size(); 
    dates.clear(); 

Это фактически сократило время работы!

Время, затраченное на код в вопросе: 275000 (в наносекунд)

Время, затраченное на новое решение: 103000

1

следующий 13 марта 2016 г. изменить время по EST по EDT. Таким образом, SimpleDateFormat позаботится об этом изменении.

Go here

+0

Прошу прощения. Я мало знаю о ** Летнее время **. Этот вопрос был отмечен в нашей продукции. Должен ли я делать какие-либо изменения уровня кода, чтобы справиться с этим? Это очень редкое явление? Как мне сообщить об этом моему американскому клиенту? –

+0

@JudeNiroshan: Не редкость! Каждый год у вас такая же проблема, когда меняются EST -> EDT и наоборот. Эта же проблема возникает, если вы работаете с другим часовым поясом (т. Е. Европа против Америки). –

+0

Но мой вопрос - почему ** SimpleDateFomatter ** возвратил два разных часовых пояса? EST для 12-го и EDT на 16-й? –

1

Разница имеет вызванное летнего времени, который в течение 2016 года планируется в 13 марта 2016 года. Здесь вы можете прочитать короткую статью о разнице между EDT and EST.