java .time и ThreeTenABP
DateTimeFormatter jsonDateFormatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSS");
DateTimeFormatter turkishDateFormatter
= DateTimeFormatter.ofPattern("EEEE MMM d", Locale.forLanguageTag("tr"));
ZoneId zone = ZoneId.of("Europe/Istanbul");
String dateFromJson = "2019-11-27 14:42:23.000000";
String timezoneTypeFromJson = "3";
String timezoneFromJson = "UTC";
if (! timezoneTypeFromJson.equals("3")) {
throw new IllegalStateException("This Stack Overflow answer only supports timezone_type 3");
}
LocalDateTime ldt = LocalDateTime.parse(dateFromJson, jsonDateFormatter);
ZoneId jsonZone = ZoneId.of(timezoneFromJson);
ZonedDateTime dateTime = ldt.atZone(jsonZone).withZoneSameInstant(zone);
ZonedDateTime futureDateTime = dateTime.plusMonths(4);
String wantedDateString = futureDateTime.format(turkishDateFormatter);
System.out.println(wantedDateString);
Требуется вывод:
Кума Мар 27
(Турки sh для пятница, 27 марта )
Согласно этот ответ timezone_type 3 действительно означает идентификатор часового пояса в виде регион / город , для Например, Европа / Лондон или др. / UT C. UTC
является псевдонимом Etc/UTC
, поэтому тоже работает.
Если вам не нужен результат в часовом поясе Стамбула, просто введите другой код в код.
SimpleDateFormat
общеизвестно хлопотно и также не может анализировать строку даты-времени с 6 десятичными числами в секундах (он поддерживает только 3 десятичных знака). Это также давно устарело. Date
и Calendar
тоже плохо спроектированы и давно устарели. Вместо этих классов я использую java .time, современный Java API даты и времени.
Или использую встроенный локализованный формат
Вы хотели, чтобы ваша дата печаталась с день недели, а год пропущен. Для этого вам нужно вручную указать формат, как я делаю выше. Так что в основном для других читателей: для большинства целей подходит встроенный формат и имеет два потенциальных преимущества: он хорошо соответствует ожиданиям пользователей и хорошо поддается интернационализации. Например:
DateTimeFormatter turkishDateFormatter = DateTimeFormatter
.ofLocalizedDate(FormatStyle.LONG)
.withLocale(Locale.forLanguageTag("tr"));
27 марта 2020 г. Кума
или короче:
DateTimeFormatter turkishDateFormatter = DateTimeFormatter
.ofLocalizedDate(FormatStyle.MEDIUM)
.withLocale(Locale.forLanguageTag("tr"));
27.Mar.2020
Вопрос: Разве java .time не требует Android API уровня 26?
java .time прекрасно работает как на старых, так и на новых Android устройствах. Для этого требуется как минимум Java 6 .
- В Java 8 и более поздних версиях, а также на более новых Android устройствах (от уровня API 26) современный встроенный API -in.
- В не- Android Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. ссылки внизу).
- Вкл. (Старше) Android используйте версию Android ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Ссылки