Android DateFormatter выводит восточное летнее время вместо EDT

#android #date #timezone #date-format #simpledateformat

#Android #Дата #Часовой пояс #формат даты #simpledateformat

Вопрос:

Итак, я пытаюсь напечатать строку «Восточное дневное время» вместо EDT. Это должно быть динамическим, а не жестко запрограммированным. Изучение класса DateFormatter не привело меня к ответу, который сработал.

Вот пример, который позволяет мне форматировать, но не привел меня к моему конкретному ответу.

Я возвращаю дату в следующем формате —

2013-06-08T00:00:00-04:00

Вот кое-что, что я пробовал —

1)

  String dateString = changeFormatDateStringWithDefaultTimeZone(paymentConfirmation.getTransactionDate(),
                "yyyy-MM-dd'T'HH:mm:ssZ",
                "M/d/yyyy hh:mm a zz");



 public static String changeFormatDateStringWithDefaultTimeZone(String value, String ip_format, String op_format) {
        if (value == null)
            return null;

        try {
            SimpleDateFormat opSDF = new SimpleDateFormat(op_format, Locale.US);
            opSDF.setTimeZone(TimeZone.getDefault());

            SimpleDateFormat inSDF = new SimpleDateFormat(ip_format, Locale.US);

            Date date = inSDF.parse(value);
            return(opSDF.format(date));

        } catch (Exception e) {
            Log.e("Err", "Failed to convert time " value);
            e.printStackTrace();
        }
        return null;
    }
  

2)

  Date today = Calendar.getInstance().getTime();
 String todayString = DateUtils.convertDateToStringWithTimeZone(today);


 public static String convertDateToStringWithTimeZone(Date date){
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
        String dateString = df.format(date);
        dateString  = " "   TimeZone.getDefault().getDisplayName(false, TimeZone.LONG);
        return dateString;
    }
  

Они всегда печатают часовой пояс как EDT, и я хочу строку Eastern Daylight Time. Кто-нибудь может мне помочь с этим?

Комментарии:

1. Кажется, ресурсы Android вашего устройства отличаются. Возможно, вы можете попробовать обновить свою ОС Android.

2. работает под управлением Android 6.0.1 и протестирован на двух устройствах.

3. Что ж, в первом примере следует использовать «zzzz», а не «zz», но это, наконец, показало бы, что дает вам второй способ. Вы также смотрели на класс DateFormatSymbols и его метод getZoneStrings() ?

4. zzzz сработал для меня. Вы хотите сделать это ответом, чтобы я мог его принять?

5. Хм, хотя я ожидал, что zzzz сработает, я все еще не понимаю, почему TimeZone.getDefault().getDisplayName(false, TimeZone.LONG) у вас не работает. Кстати, мне также интересно, почему вы получаете «Восточное время» (или «ET») вместо «Восточного стандартного времени» (EST). Я все еще склонен подозревать, что существуют ресурсы с именем зоны, зависящие от устройства или специфичные для Android. Вы действительно должны печатать TimeZone.getDefault().getID() и проверять DateFormatSymbols тоже.

Ответ №1:

Хорошо, основываясь на вашем последнем редактировании вопроса, решение должно быть таким:

пример 1)

Шаблон вывода следует изменить на «M / d / yyyy hh: mm a zzzz» (обратите внимание на количество z-символов, чтобы обеспечить соблюдение полного названия зоны). В зависимости от даты и базового часового пояса программа форматирования SimpleDateFormat автоматически определит, следует ли использовать дневное время или стандартное название.

случай 2)

Используйте TimeZone.getDefault().getDisplayName(true, TimeZone.LONG) для принудительного использования длинного названия daylight. Если ваш часовой пояс по умолчанию «America / New_York», то такое выражение должно выводить «Восточное летнее время». Обратите внимание, что логический параметр был изменен на true .