java.time
Другие ответы правильно объяснили, почему ваш код дал вам дату 1 января 1970 года. Я хотел бы представить современную правильную версию кода.Я думаю, что вы ищете что-то вроде этого:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMdd HHmm");
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
if (zdt.getMinute() < 40) {
zdt = zdt.minusHours(1);
}
ZonedDateTime wholeHours = zdt.truncatedTo(ChronoUnit.HOURS);
String baseNow = wholeHours.format(formatter);
System.out.println(baseNow);
Запустив это прямо сейчас (00:52 в Южной Корее), оно напечатало:
20180607 0000
Я использую java.time
, современный Java-интерфейс даты и времени, потому что Calendar
, GregorianCalendar
, Date
и SimpleDateFormat
все давно устарели и плохо разработаны, а java.time
намного приятнееработать с.
Кажется, есть еще одна ошибка в вашем коде.Calendar.MINUTE
и Calendar.HOUR_OF_DAY
являются константами со значениями 12 и 11, поэтому Calendar.MINUTE < 40
всегда будет истинным, а Calendar.HOUR_OF_DAY == 0
никогда не будет.Вместо этого вы, вероятно, намеревались cal.get(Calendar.MINUTE)
и аналогично для часа дня.Урок для изучения: со старыми классами очень легко совершать ошибки, а также те, которые остаются незамеченными, а другие трудно определить.Я рекомендую вам избегать этих классов.
Вопрос: Могу ли я использовать java.time на Android?
Да, java.time
прекрасно работает на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .
- В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26, как мне сказали), современный API поставляется встроенным.
- В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. ссылки внизу).
- На (более старом) использовании AndroidAndroid-версия ThreeTen Backport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Ссылки