Вопрос по date-format, java, timezone, date – Как отобразить дату с пользовательским часовым поясом?

10

Допустим, у меня есть строка, которая представляет дату, которая выглядит следующим образом:

«Ср. 08 июля, 17:08:48 GMT 2009».

Поэтому я анализирую эту строку в объект даты, как это:

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy");
Date fromDate = (Date)formatter.parse(fromDateString);

Это дает мне правильную дату объекта. Теперь я хочу отобразить эту дату как значение CDT.

Я пробовал много вещей, и я просто не могу заставить его работать правильно. Должен быть простой метод, использующий класс DateFormat, чтобы заставить это работать. Любой совет? Моя последняя попытка была такой:

formatter.setTimeZone(toTimeZone);
String result = formatter.format(fromDate);

Ваш Ответ

4   ответа
2

что выкопал старую ветку. Но мне было интересно, существует ли java-класс, который содержит все идентификаторы часовых поясов как постоянный класс. Таким образом, вместо того, чтобы жестко кодировать идентификатор часового пояса при установке часового пояса следующим образом:

formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));

вместо этого мы будем делать что-то более стандартное / единообразное:

formatter.setTimeZone(TimeZone.getTimeZone(SomeConstantClass.US_CENTRAL)); 

где SomeConstantClass.java - это класс, который содержит константы, ссылающиеся на различные идентификаторы часовых поясов, которые поддерживаются классом TimeZone.

17

zzz & quot; вместо "ZZZ": "Z" является символом часового пояса RFC822.

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");

Сказав это, мой стандартный совет о дате / времени вещи использоватьВремя йода, который в целом лучше API.

РЕДАКТИРОВАТЬ: Короткая, но полная программа:

import java.text.*;
import java.util.*;

public class Test
{
    public List<String> names;

    public static void main(String [] args)
        throws Exception // Just for simplicity!
    {
        String fromDateString = "Wed Jul 08 17:08:48 GMT 2009";
        DateFormat formatter = new SimpleDateFormat
            ("EEE MMM dd HH:mm:ss zzz yyyy");
        Date fromDate = (Date)formatter.parse(fromDateString);
        TimeZone central = TimeZone.getTimeZone("America/Chicago");
        formatter.setTimeZone(central);
        System.out.println(formatter.format(fromDate));
    }
}

Выходной: ср 08 июл 12:08:48 CDT 2009

Есть, как указано в ответе. Просто ожидайте больше боли, если у вас есть какие-либо другие манипуляции с датой / временем.
Тогда вы используете неправильный часовой пояс - в моем тестовом случае он работал нормально. Я добавлю короткую, но полную программу для демонстрации.
Да, ты был прав ... чувак, это боль. Был ли правильный код все время, и опечатка в моем модульном тесте помешала ему работать правильно. Kyle Boon
Это не помогает. Форматировщик всегда выплевывает время по Гринвичу, а не по требованию CDT. Kyle Boon
К сожалению, я не могу добавить еще одну зависимость без дополнительной волокиты, с которой я хочу иметь дело. Должен быть способ форматирования часовых поясов с использованием стандартных библиотек Java. Kyle Boon
1

ZonedDateTime

Укажите шаблон форматирования, соответствующий вашей входной строке. Коды похожи наSimpleDateFormat но не совсем. Обязательно прочитайте документооборот дляDateTimeFormatter, Обратите внимание, что мы указываемLocale определить, какой человеческий язык использовать для названия дня недели и названия месяца.

String input = "Wed Jul 08 17:08:48 GMT 2009";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss z uuuu" , Locale.ENGLISH );
ZonedDateTime zdt = ZonedDateTime.parse ( input , f );

zdt.toString(): 2009-07-08T17:08:48Z[GMT]

Мы можем настроить это в любой другой часовой пояс.

Укажитеправильное название часового пояса в форматеcontinent/region, Никогда не используйте 3-4 буквенное сокращение, такое какCDT или жеEST или жеIST поскольку они не являются истинными часовыми поясами, не стандартизированы и даже не уникальны (!).

Я догадываюсь, что поCDT Вы имели в виду часовой пояс, какAmerica/Chicago.

ZoneId z = ZoneId.of( "America/Chicago" );
ZonedDateTime zdtChicago = zdt.withZoneSameInstant( z );

zdtChicago.toString() 2009-07-08T12:08:48-05:00[America/Chicago]

Instant

Обычно лучше всего работать в UTC. Для этого извлекатьInstant,Instant класс представляет момент на временной шкале вуниверсальное глобальное время с разрешениемнаносекунд (до девяти (9) цифр десятичной дроби).

этоInstant класс - это базовый класс строительных блоков java.time. Вы можете думать оZonedDateTime какInstant плюсZoneId.

Instant instant = zdtChicago.toInstant();

instant.toString(): 2009-07-08T17:08:48Z

About java.time

java.time фреймворк встроен в Java 8 и выше. Эти классы вытесняют хлопотное староенаследие классы даты и времени, такие какjava.util.Date, .Calendar& amp;java.text.SimpleDateFormat.

Joda времени проект, сейчас вРежим технического обслуживания, советует перейти на java.time.

Чтобы узнать больше, см.Oracle Tutorial, И поиск переполнения стека для многих примеров и объяснений. СпецификацияJSR 310.

Где взять классы java.time?

Java SE 8 and SE 9 and later Built-in. Part of the standard Java API with a bundled implementation. Java 9 adds some minor features and fixes. Java SE 6 and SE 7 Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport. Android The ThreeTenABP project adapts ThreeTen-Backport (mentioned above) for Android specifically. See How to use….

ThreeTen-Extra Проект расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь, такие какInterval, YearWeek, YearQuarter, а такжеБольше.

3

formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));

выходы:

Wed Jul 08 12:08:48 CDT 2009

для даты в вашем примере на моей машине. То есть после замены zzz на ZZZ в строке формата.

Похожие вопросы