Вопрос по date-format, java, timezone, date – Как отобразить дату с пользовательским часовым поясом?
Допустим, у меня есть строка, которая представляет дату, которая выглядит следующим образом:
«Ср. 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);
что выкопал старую ветку. Но мне было интересно, существует ли java-класс, который содержит все идентификаторы часовых поясов как постоянный класс. Таким образом, вместо того, чтобы жестко кодировать идентификатор часового пояса при установке часового пояса следующим образом:
formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));
вместо этого мы будем делать что-то более стандартное / единообразное:
formatter.setTimeZone(TimeZone.getTimeZone(SomeConstantClass.US_CENTRAL));
где SomeConstantClass.java - это класс, который содержит константы, ссылающиеся на различные идентификаторы часовых поясов, которые поддерживаются классом TimeZone.
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
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.timejava.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
, а такжеБольше.