Как получить разницу без часовых поясов между двумя временами? - PullRequest
2 голосов
/ 27 июля 2011

В вопросе Очень странная дата до 1970 , я знаю причину, по которой два раза выглядят только с разницей в 1 с, но иногда мы можем получить другое значение.

Например, изэтот вопрос:

public static void main(String[] args) throws ParseException {
    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    String str3 = "1927-12-31 23:54:07";  
    String str4 = "1927-12-31 23:54:08";  
    Date sDt3 = sf.parse(str3);  
    Date sDt4 = sf.parse(str4);  
    long ld3 = sDt3.getTime() /1000;  
    long ld4 = sDt4.getTime() /1000; 
    System.out.println(ld4-ld3);
}

Выход будет 353 в часовом поясе Shanghai, но будет 1 в других часовых поясах.

Мой вопрос, как рассчитатьразница без часовых поясов?Как всегда получить правильную разницу?

Ответы [ 3 ]

1 голос
/ 27 июля 2011

В настоящее время в Шанхае часовой пояс был изменен с LMT на CST.

В воскресенье, 1 января 1928 года, часы 00:00:00 были переведены назад на 0:05:52 часов в субботу., 31 декабря 1927 года, 23:54:08 вместо местного времени

http://www.timeanddate.com/worldclock/clockchange.html?n=237&year=1927

1 голос
/ 27 июля 2011

Вы можете легко обрабатывать часовые пояса с Joda Time .

  • Вы можете создать DateTimeFormatter с желаемым часовым поясом и использовать его для анализа строки. Экземпляры DateTime также могут быть преобразованы в другие часовые пояса .

  • Вы можете полностью игнорировать часовые пояса, используя LocalDateTime класс.

  • Также класс Period имеет такие методы, как toStandardSeconds () , toStandardDuration () , normalizedStandard () и т. Д. который "предполагает, что все недели - 7 дней, все дни - 24 часа, все часы - 60 минут, а все минуты - 60 секунд. Это не так, если рассматривать переход на летнее время, а также может быть неверным для некоторых необычных хронологии. Однако, он включен, поскольку это полезная операция для многих приложений и бизнес-правил. "

Вот как можно создать LocalDateTime без часового пояса либо напрямую, либо путем преобразования из экземпляра DateTime с часовым поясом.

LocalDateTime a1 = new LocalDateTime(1927, 12, 31, 0, 0, 0, 0);
LocalDateTime a2 = new LocalDateTime(1928, 1, 2, 0, 0, 0, 0);
System.out.println(a1);
System.out.println(a2);
System.out.println(Seconds.secondsBetween(a1, a2).getSeconds()); // 172800 == 60 * 60 * 24 * 2 == 2 days without leap seconds

DateTime b1 = new DateTime(1927, 12, 31, 0, 0, 0, 0, DateTimeZone.forID("Asia/Shanghai"));
DateTime b2 = new DateTime(1928, 1, 2, 0, 0, 0, 0, DateTimeZone.forID("Asia/Shanghai"));
System.out.println(b1);
System.out.println(b2);
System.out.println(Seconds.secondsBetween(b1, b2).getSeconds());

LocalDateTime c1 = b1.toLocalDateTime();
LocalDateTime c2 = b2.toLocalDateTime();
System.out.println(c1);
System.out.println(c2);
System.out.println(Seconds.secondsBetween(c1, c2).getSeconds());

Будет напечатано следующее. Обратите внимание на забавный часовой пояс в Шанхае до его настройки часового пояса в 1927 .

1927-12-31T00:00:00.000
1928-01-02T00:00:00.000
172800
1927-12-31T00:00:00.000+08:05:52
1928-01-02T00:00:00.000+08:00
173152
1927-12-31T00:00:00.000
1928-01-02T00:00:00.000
172800
0 голосов
/ 16 мая 2012

Вместо преобразования каждой даты в длинную поставьте код:

long i = (sDt4.getTime() - sDt3.getTime()) / (1000);
System.out.println(i);

Вывод:

1
...