Дата конвертации Java в строку мирового

На языке Java.утиль.Дата метод toString (метод) отображает дату в местном часовом поясе.

Существует несколько общих сценариев, в которых мы хотим, чтобы данные, которые будут напечатаны в мирового, в том числе журналы, экспорт данных и коммуникации с внешними программами.

  • Что's самый лучший способ создать строковое представление `Ява.утиль.Дата в UTC?
  • Как заменить Дж.у.Даты `метод toString (формат), которые еще'т сортируемый (спасибо, @JonSkeet!) С лучше формат?

Дополнениями

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

final Date date = new Date();
final String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS zzz";
final SimpleDateFormat sdf = new SimpleDateFormat(ISO_FORMAT);
final TimeZone utc = TimeZone.getTimeZone("UTC");
sdf.setTimeZone(utc);
System.out.println(sdf.format(date));

Я искал один-лайнер, как:

System.out.println(prettyPrint(date, "yyyy-MM-dd'T'HH:mm:ss.SSS zzz", "UTC"));
Комментарии к вопросу (8)

и Java.время

В Java 8 и выше у нас есть новый Ява.время пакет встроенный (туториал). Вдохновленный Joda времени, определенный JSR 310, и расширен ThreeTen-Экстра проекта.

Лучшим решением является сортировать дате-времени объектов, а не строк. Но если вы должны работать в строки, Читать далее.

В миг представляет собой момент на временной шкале, в основном в мирового (см. Класс DOC для точных деталей). О метод toString реализация использует datetimeformatter с это.Формат ISO_INSTANT`]9 по умолчанию. Этот формат включает в себя ноль, три, шесть или девять цифр цифр, сколько нужно для отображения доли секунды до НС точности.

String output = Instant.now().toString(); // Example: '2015-12-03T10:15:30.120Z'

Если вы должны взаимодействовать с классом старого "дата", конвертировать в/из Java.время с помощью новых методов, добавленных в старые классы. Пример: дата::toInstant`.

myJavaUtilDate.toInstant().toString()

Возможно, вы захотите использовать другой форматтер, если вам нужен последовательный ряд цифр в дробной второй или если вы не в долях секунды.

Другому маршруту, Если вы хотите усечение долей секунды, чтобы использовать ZonedDateTime вместо мгновенный, называя ее способ сменить фракцию на ноль.

Обратите внимание, что мы должны указать часовой пояс для ZonedDateTime (отсюда и название). В нашем случае это означает, что Мирового. Подкласс ZoneID, zoneoffset в, имеет удобный постоянная для мирового. Если мы опустим часовом поясе, в JVM текущий часовой пояс неявно применяется.

String output = ZonedDateTime.now( ZoneOffset.UTC ).withNano( 0 ).toString();  // Example: 2015-08-27T19:28:58Z

Joda Времени

Обновление: проект Joda времени находится в режиме технического обслуживания, с командой, консультирование миграции на Java.классы время.

Я искал один-лайнер

Легко, если с помощью Joda времени 2.3 библиотека. ИСО 8601 является форматирование по умолчанию.

Зоны ## Времени

В приведенном ниже примере кода, обратите внимание, что я указании часового пояса, а не в зависимости от часового пояса по умолчанию. В этом случае, я'м задании мирового на ваш вопрос. Z на конце, говорят как "зулусы" Ну, значит, не смещение часового пояса от UTC.

Пример # Код#

// import org.joda.time.*;

String output = new DateTime( DateTimeZone.UTC );

Выход...

в

2013-12-12T18:29:50.588Z
Комментарии (2)
Решение

Следующие полезные замечания, я'вэ полностью перестроен дата праматерии. Использование предполагается:

  • Быть коротким (один вкладыш)
  • Представляют собой одноразовые объекты (часовой пояс, формат) как строки
  • Поддержка полезна, сортировки ИСО форматы и устаревший формат из коробки

Если вы считаете этот код полезным, я могу опубликовать исходный и банку в GitHub.

Использование ###

// The problem - not UTC
Date.toString()                      
"Tue Jul 03 14:54:24 IDT 2012"

// ISO format, now
PrettyDate.now()        
"2012-07-03T11:54:24.256 UTC"

// ISO format, specific date
PrettyDate.toString(new Date())         
"2012-07-03T11:54:24.256 UTC"

// Legacy format, specific date
PrettyDate.toLegacyString(new Date())   
"Tue Jul 03 11:54:24 UTC 2012"

// ISO, specific date and time zone
PrettyDate.toString(moonLandingDate, "yyyy-MM-dd hh:mm:ss zzz", "CST") 
"1969-07-20 03:17:40 CDT"

// Specific format and date
PrettyDate.toString(moonLandingDate, "yyyy-MM-dd")
"1969-07-20"

// ISO, specific date
PrettyDate.toString(moonLandingDate)
"1969-07-20T20:17:40.234 UTC"

// Legacy, specific date
PrettyDate.toLegacyString(moonLandingDate)
"Wed Jul 20 08:17:40 UTC 1969"

Код

(Этот код является также предметом вопрос на проверку кода клиент StackExchange)

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

/**
 * Formats dates to sortable UTC strings in compliance with ISO-8601.
 * 
 * @author Adam Matan 
 * @see http://stackoverflow.com/questions/11294307/convert-java-date-to-utc-string/11294308
 */
public class PrettyDate {
    public static String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS zzz";
    public static String LEGACY_FORMAT = "EEE MMM dd hh:mm:ss zzz yyyy";
    private static final TimeZone utc = TimeZone.getTimeZone("UTC");
    private static final SimpleDateFormat legacyFormatter = new SimpleDateFormat(LEGACY_FORMAT);
    private static final SimpleDateFormat isoFormatter = new SimpleDateFormat(ISO_FORMAT);
    static {
        legacyFormatter.setTimeZone(utc);
        isoFormatter.setTimeZone(utc);
    }

    /**
     * Formats the current time in a sortable ISO-8601 UTC format.
     * 
     * @return Current time in ISO-8601 format, e.g. :
     *         "2012-07-03T07:59:09.206 UTC"
     */
    public static String now() {
        return PrettyDate.toString(new Date());
    }

    /**
     * Formats a given date in a sortable ISO-8601 UTC format.
     * 
     * <pre>
     * <code>
     * final Calendar moonLandingCalendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
     * moonLandingCalendar.set(1969, 7, 20, 20, 18, 0);
     * final Date moonLandingDate = moonLandingCalendar.getTime();
     * System.out.println("UTCDate.toString moon:       " + PrettyDate.toString(moonLandingDate));
     * >>> UTCDate.toString moon:       1969-08-20T20:18:00.209 UTC
     * </code>
     * </pre>
     * 
     * @param date
     *            Valid Date object.
     * @return The given date in ISO-8601 format.
     * 
     */

    public static String toString(final Date date) {
        return isoFormatter.format(date);
    }

    /**
     * Formats a given date in the standard Java Date.toString(), using UTC
     * instead of locale time zone.
     * 
     * <pre>
     * <code>
     * System.out.println(UTCDate.toLegacyString(new Date()));
     * >>> "Tue Jul 03 07:33:57 UTC 2012"
     * </code>
     * </pre>
     * 
     * @param date
     *            Valid Date object.
     * @return The given date in Legacy Date.toString() format, e.g.
     *         "Tue Jul 03 09:34:17 IDT 2012"
     */
    public static String toLegacyString(final Date date) {
        return legacyFormatter.format(date);
    }

    /**
     * Formats a date in any given format at UTC.
     * 
     * <pre>
     * <code>
     * final Calendar moonLandingCalendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
     * moonLandingCalendar.set(1969, 7, 20, 20, 17, 40);
     * final Date moonLandingDate = moonLandingCalendar.getTime();
     * PrettyDate.toString(moonLandingDate, "yyyy-MM-dd")
     * >>> "1969-08-20"
     * </code>
     * </pre>
     * 
     * 
     * @param date
     *            Valid Date object.
     * @param format
     *            String representation of the format, e.g. "yyyy-MM-dd"
     * @return The given date formatted in the given format.
     */
    public static String toString(final Date date, final String format) {
        return toString(date, format, "UTC");
    }

    /**
     * Formats a date at any given format String, at any given Timezone String.
     * 
     * 
     * @param date
     *            Valid Date object
     * @param format
     *            String representation of the format, e.g. "yyyy-MM-dd HH:mm"
     * @param timezone
     *            String representation of the time zone, e.g. "CST"
     * @return The formatted date in the given time zone.
     */
    public static String toString(final Date date, final String format, final String timezone) {
        final TimeZone tz = TimeZone.getTimeZone(timezone);
        final SimpleDateFormat formatter = new SimpleDateFormat(format);
        formatter.setTimeZone(tz);
        return formatter.format(date);
    }
}
Комментарии (10)

Следующий упрощенный код, основанный на принято отвечать выше, работал для меня:

public class GetSync {
    public static String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS zzz";
    private static final TimeZone utc = TimeZone.getTimeZone("UTC");
    private static final SimpleDateFormat isoFormatter = new SimpleDateFormat(ISO_FORMAT);
    static {
        isoFormatter.setTimeZone(utc);
    }

    public static String now() {
        return isoFormatter.format(new Date()).toString();
    }
}

Я надеюсь, что это помогает кто-то.

Комментарии (1)

и Java.время.Мгновенный

Просто используйте МиГ от Ява.время.

    System.out.println(Instant.now());

Это просто напечатано:

2018-01-27T09:35:23.179612Z

Мгновенный.метод toString всегда дает мирового времени.

Выход обычно сортные, но бывают несчастные исключения. метод toString дает достаточно группы из трех знаков после запятой для отображения точности она имеет. На Java 9 на моем Mac точность мгновенный.теперь (), кажется, микросекунды, но мы должны ожидать, что приблизительно в одном случае из тысячи это будет хит целое число миллисекунд и печать только трех знаков после запятой. Строки с неравным количеством десятичных знаков будет отсортирована в неправильном порядке (если вы пишете пользовательский компаратор это учитывать).

МиГ является одним из классов в языке Java.времени, современных Java и API времени, которое я настоятельно рекомендую вам использовать вместо класса устаревшие даты. `в Java.время-это встроенные в Java 8 и выше, а также были бэкпортированы в Java 6 и 7.

Комментарии (0)

Если кинокомпании xStream является зависимостью, попробуйте:

new com.thoughtworks.xstream.converters.basic.DateConverter().toString(date)
Комментарии (0)

Почему бы просто не использовать Java.текст.Класса simpledateformat ?

Date someDate = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String s = df.format(someDate);

Или увидеть: http://www.tutorialspoint.com/java/java_date_time.htm

Комментарии (1)

Ну если вы хотите использовать Java.утиль.Дата только, здесь есть небольшая хитрость вы можете использовать:

Строки как datestring = долго.метод toString(дата.Мирового(дата.возвратите(), дата.getMonth(), дата.getdate(), то дата.getHours(), дата.getMinutes(), дата.getSeconds()));

Комментарии (0)