Хобрук: Ваш путь к мастерству в программировании

SimpleDateFormat создает разные выходные данные часового пояса в Android и JDK

Здесь на SimpleDateFormat много вопросов, но я ничего не могу найти по этому вопросу. У меня возникают проблемы с разным выводом одного и того же кода, работающего на Android и JDK. Я работаю в Eclipse и использую эмулятор для тестирования Android. JDK версии 1.7 и Android 4.4.

Любые идеи о том, как сделать выходные даты Android в формате стиля JDK?

TimeZone GMT_ZONE = TimeZone.getTimeZone("GMT");
String RFC1123_PATTERN = "EEE, dd MMM yyyy HH:mm:ss z";

final DateFormat rfc1123Format = new SimpleDateFormat(RFC1123_PATTERN, LOCALE_US);
rfc1123Format.setTimeZone(GMT_ZONE);
String dateString = rfc1123Format.format(new Date()); 

Значение dateString JDK 1.7: пятница, 20 декабря 2013 г., 00:46:21 GMT

Значение dateString для Android 4.4: пятница, 20 декабря 2013 г., 00:46:21 GMT+00:00


  • Android - это повторная реализация с некоторыми отличиями, может быть, попробовать другой шаблон? stackoverflow.com/questions/10584647/ 20.12.2013
  • Мне жаль читать, что вы используете эмулятор. Святая корова, это медленно. Вам придется просто полагаться на то, что использует Android, или убрать букву «z» из шаблона. 20.12.2013
  • Да, я понимаю, что Android и JDK разные (поэтому мне приходится так много работать, чтобы заставить их работать хорошо). Однако мне действительно нужен шаблон в стиле JDK, поскольку я работаю с другой службой, для которой требуется этот формат. Есть идеи, какой шаблон будет создавать вывод в формате Fri, 20 Dec 2013 00:46:21 GMT на Android? 20.12.2013

Ответы:


1

Андроид != Ява

Библиотеки Android являются имитацией библиотек Java, но не точными копиями. Таким образом, судебный процесс между Oracle и Google. Таким образом, вы можете увидеть изменения в поведении.

Джода-Время

Если вам нужен согласованный и превосходный опыт при работе с датой и временем, используйте сторонние ресурсы с открытым исходным кодом Joda-Time. Joda-Time предназначен для замены заведомо плохих классов java.util.Date/Calendar.

JSR 310

Другим вариантом может быть резервная копия Java 7 для JSR 310: Date and Time API классы java.time.* в комплекте с Java 8.

Формат RFC 1123

Что касается дополнительного вопроса, который вы добавили в качестве комментария:

Есть идеи, какой шаблон будет создавать вывод в формате Fri, 20 Dec 2013 00:46:21 GMT на Android?

Удивительно, но в Joda-Time 2.3 отсутствует встроенный модуль форматирования для этого старого формата RFC 1123. Но следующий самодельный формат, кажется, справляется со своей задачей, если вы не забудете преобразовать DateTime в UTC, как показано ниже.

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

DateTime nowInParis = new DateTime( DateTimeZone.forID( "Europe/Paris" ) );

DateTimeFormatter formatter = DateTimeFormat.forPattern("E, d MMM yyyy HH:mm:ss 'GMT'").withLocale( Locale.US );
String nowInParisAsStringGMT = formatter.print( nowInParis.toDateTime( DateTimeZone.UTC ) );

Дамп на консоль…

System.out.println( "nowInParisAsStringGMT: " + nowInParisAsStringGMT );
System.out.println( "nowInParis: " + nowInParis );

При запуске…

nowInParisAsStringGMT: Fri, 20 Dec 2013 05:03:58 GMT
nowInParis: 2013-12-20T05:03:58.175+01:00
20.12.2013
  • Спасибо! Я понял, что они разные, но, учитывая, что у обоих есть примеры, в которых z должен выводить результат в стиле GMT ​​(а не GMT+), я задался вопросом, была ли это известная ошибка или я неправильно понял документацию. Возможно, мне нужны какие-то дополнительные настройки? 20.12.2013
  • Я не знаю ответа на ваш вопрос о настройках. Но я знаю, что это только первая из многих головных болей, ожидающих вас, если вы продолжите использовать классы java.util.Date/Calendar или их имитации в Android. Нет причин не использовать Joda-Time (или резервную копию JSR 310), кроме одной: некоторые люди сообщают о замедлении при первом вызове Joda-Time в Android (только для Android, на реальной платформе Java вообще нет проблем). Я не знаю подробностей проблемы замедления. Но с оговоркой, что вы исследуете эту проблему, я настоятельно рекомендую перейти на Joda-Time или JSR 310 и никогда не оглядываться назад. 20.12.2013
  • Я не уверен, что смогу использовать JodaTime, но подробное описание того, как его использовать (и предупреждение об Android), полезно. Я пока отмечу вас как ответ, если кто-то другой не сможет ответить на более сложный дополнительный вопрос о форматировании. 20.12.2013

  • 2

    Вот слегка измененная версия ответа Василия для тех, кто не хочет использовать Joda-Time:

    private String toRfc1123(Date date) {
        SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
        formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
        return formatter.format(date);
    }
    
    27.05.2014
    Новые материалы

    Понимание СТРУКТУРЫ ДАННЫХ И АЛГОРИТМА.
    Что такое структуры данных и алгоритмы? Термин «структура данных» используется для описания того, как данные хранятся, а алгоритм используется для описания того, как данные сжимаются. И данные, и..

    Как интегрировать модель машинного обучения на ios с помощью CoreMl
    С выпуском новых функций, таких как CoreML, которые упростили преобразование модели машинного обучения в модель coreML. Доступная модель машинного обучения, которую можно преобразовать в модель..

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..