Ошибка часового пояса Android действительно странная

#java #android

#java #Android

Вопрос:

Кто-нибудь может сказать мне, что где код здесь дает разные результаты?

     Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(1477785600000l);
    cal.add(Calendar.DAY_OF_MONTH, 1);
    System.out.println(cal.getTime());
    System.out.println(cal.getTimeInMillis());


    Calendar cal1 = Calendar.getInstance();
    cal1.setTimeInMillis(1477785600000l);
    cal1.add(Calendar.HOUR, 24);
    System.out.println(cal1.getTime());
    System.out.println(cal1.getTimeInMillis());
  

Он отлично работает на стороне сервера, но дает разные результаты при запуске на платформе Android.

Комментарии:

1. И часовой пояс — «GMT»

2. Почему бы им не дать разные результаты?

3. Я думаю, что 24 часа должны равняться 1 дню……

4. между двумя результатами есть часовой разрыв.

5. хорошо, чтобы сделать это более очевидным, я запускаю следующий код:

Ответ №1:

Вы должны использовать Calendar.HOUR_OF_DAY вместо Calendar.HOUR . Вот так:

 cal1.add(Calendar.HOUR_OF_DAY, 23);
  

Комментарии:

1. почему? есть разница?

2. @DaisyLi конечно, это имеет значение. Просмотрите документы. HOUR_OF_DAY представляет часы от 0 до 23.

Ответ №2:

Используете ли вы один и тот же экземпляр календаря для сравнения равенства результатов?

 Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(1477785600000l);
//add 1 day to the date
cal.add(Calendar.DAY_OF_MONTH, 1);
Log.e("first time", ""   cal.getTime());
Log.e("second time", ""   cal.getTimeInMillis());
//reset the calendar to the instance value removing the day added before
cal.add(Calendar.DAY_OF_MONTH, -1); //or you can use cal.setTimeInMillis(1477785600000l);
//add 24 hours to the base calendar value
cal.add(Calendar.HOUR, 24);
Log.e("third time", ""   cal.getTime());
Log.e("fourth time", ""   cal.getTimeInMillis());
  

И я получаю те же значения в выводе Android Monitor

 E/first time: Mon Oct 31 02:00:00 CET 2016
E/second time: 1477875600000
E/third time: Mon Oct 31 02:00:00 CET 2016
E/fourth time: 1477875600000
  

Ответ №3:

Просто копия комментария Томаса. Это правильный ответ, и спасибо вам всем

Имейте в виду, что 1 день не обязательно равен 24 часам, т. Е. При переходе на летнее время. В качестве примера (неверно, просто чтобы проиллюстрировать суть), если бы я добавил 1 день к 2: 00 31 октября, я бы ожидал получить 1 ноября 2: 00, но если я добавлю 24 часа, и в это время произойдет переключение на летнее время, я мог бы получить 1 ноября 3: 00 (или около того). — Я имею в виду, что если вы добавите 1 в поле «день», час не изменится, но если вы добавите 24 в поле «час», вы также получите расчет дня (перенос), который может включать летнее время.

Ответ №4:

Пожалуйста, ознакомьтесь с методом Cal.add(). В первом случае вы добавляете месяц, а во втором — час. Измените их, и все будет работать нормально.

Пожалуйста, смотрите ссылку на документацию:https://developer.android.com/reference/java/util/Calendar.html#getDisplayNames (int, int, java.util.Язык)

Вам нужно использовать HOUR_OF_DAY для формата 24hr. ЧАС — это ЧАС, используемый для 12-часовых часов (0-11). Полдень и полночь представлены 0, а не 12. Например, в 10:04:15.250 часов 10, а не 22.

Комментарии:

1. в первом случае я добавляю один день. и во втором случае я добавляю 24 часа?

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