формат даты Календарь в Android - PullRequest
0 голосов
/ 10 февраля 2020

Так написано, я хочу изменить способ написания. Я хочу, чтобы это было записано в Turki sh как в пятницу 27 марта. Возвращает ноль, когда я изменяю орфографию в SimpleDateFormat. Я печатаю данные, которые я извлек из базы данных.

Требуемый вывод: Cuma Mar 27 (Turki sh)

Вывод базы данных:

date ":" 2019-11-27 14: 42: 23.000000 "," timezone_type ": 3," timezone ":" UTC "

Android вывод:

Fri Mar 27 14:42:23 GMT+03:00 2020

Код:

JSONObject form_tarih2 = jObj.getJSONObject("form_tarih2");
String date = form_tarih2.getString("date");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", 
        java.util.Locale.getDefault());
Date calculateDate = sdf.parse(date);
tarihstring = calculateDate;

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
calendar.setTime(sdf.parse(String.valueOf(tarihstring)));

calendar.add(Calendar.MONTH,4);
Date future = calendar.getTime();

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

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 с подпакетами.

Ссылки

0 голосов
/ 10 февраля 2020

Используйте это, чтобы конвертировать даты. Сделайте это c для использования в любом месте из приложения

        String s=getFormatedTime("2019-11-27 14: 42: 23.000000","yyyy-MM-dd HH:mm:ss.SSSSSS","EEEE MMM dd");

ваша функция: -

public static String getFormatedTime(String dateStr, String strReadFormat, String strWriteFormat) {
    if (dateStr == null) return "";
    String formattedDate = dateStr;

    DateFormat readFormat = new SimpleDateFormat(strReadFormat, Locale.getDefault());
    DateFormat writeFormat = new SimpleDateFormat(strWriteFormat, new Locale("tr"));

    Date date = null;

    try {
        date = readFormat.parse(dateStr);
    } catch (ParseException e) {
    }

    if (date != null) {
        formattedDate = writeFormat.format(date);
    }

    return formattedDate;
}

вы можете добавить еще 4 месяца в результате

...