#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, и вы увидите, что они дают те же результаты.