Как я могу изменить смещение календаря? - PullRequest
0 голосов
/ 08 февраля 2019

Мне нужно изменить смещение часового пояса Календаря

Я много чего пробовал;

1-

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(TimeUnit.HOURS.convert(rawOffset, TimeUnit.MILLISECONDS) + 
System.currentTimeMillis());

2-

TimeZone timezone = new SimpleTimeZone();
timezone.setRawOffset(rawOffset);

Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(timezone);

Наш API возвращает +1.0 часовой пояс (Берлин) Но я не могу изменить смещение часового пояса Каландра.Как можно поменять?

1 Ответ

0 голосов
/ 08 февраля 2019

java.time и ThreeTenABP

Не смешивайтесь с необработанными смещениями.Ява знает смещение для Берлина лучше, чем вы.И не используйте Calendar.Этот класс имеет ряд проблем с дизайном и считается устаревшим.

    ZonedDateTime zdtBerlin = ZonedDateTime.now(ZoneId.of("Europe/Berlin"));
    System.out.println("Zeit in Berlin: " + zdtBerlin);

Когда я только что запустил этот фрагмент, я получил такой вывод:

Zeit в Берлине: 2019-02-08T19: 23: 00.275 + 01: 00 [Европа / Берлин]

Как видно из названия, ZonedDateTime имеет часовой пояс.В данном случае Европа / Берлин.Это современная замена для GregorianCalendar (наиболее распространенный конкретный подкласс абстрактного класса Calendar).

Вопрос: Можно ли использовать java.time на Android?

Да, java.время работает хорошо на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26) современный API поставляется встроенным.
  • В Java 6 и 7 получают ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более старых) Android используется версия ThreeTen для AndroidBackport.Это называется ThreeTenABP.И убедитесь, что вы импортировали классы даты и времени из org.threeten.bp с подпакетами.

Что пошло не так в вашем коде?

Фрагмент 1-: вы устанавливаете Calendarпора в час в будущее.Вы не устанавливаете часовой пояс.

Фрагмент 2-: Первый SimpleTimeZone не имеет конструктора без аргументов, поэтому new SimpleTimeZone() не будет работать.Затем его setRawOffset ожидает смещение в миллисекундах.Если rawOffset равно 1, вы устанавливаете смещение в 1 миллисекунду.

Ссылки

...