Как мне отобразить дату с пользовательским часовым поясом?

StackOverflow https://stackoverflow.com/questions/1166494

Вопрос

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

"Ср. 08 июля 17:08:48 GMT 2009"

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

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

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

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

formatter.setTimeZone(toTimeZone);
String result = formatter.format(fromDate);
Это было полезно?

Решение

Используйте "zzz" вместо "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

Другие советы

Используя:

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

результаты:

Wed Jul 08 12:08:48 CDT 2009

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

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

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

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

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

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

Современный способ - это классы java.time.

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 );

здт.toString():2009-07-08T17:08:48Z[GMT]

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

Укажите a правильное название часового пояса в формате 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[Америка/Чикаго]

Instant

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

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

Instant instant = zdtChicago.toInstant();

мгновенный.toString():2009-07-08T17:08:48Z


О java.time

В java.время фреймворк встроен в Java 8 и более поздние версии.Эти классы вытесняют неприятные старые наследие классы даты и времени, такие как java.util.Date, .Calendar, & java.text.SimpleDateFormat.

В Джода-Время проект, теперь в режим технического обслуживания, советует перейти на java.time.

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

Где получить классы java.time?

  • Java SE 8 и SE 9 и позже
    • Встроенный.
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности java.time обратно перенесена на Java 6 и 7 в ThreeTen-Задний порт.
  • Android

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top