2009-07-22 14 views
8

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

«Ср июл 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); 

ответ

16

Использование «ZZZ» вместо «ZZZ»: «Z» является символом для времени RFC822 зоны.

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

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

EDIT: Короткий, но полная программа:

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

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

+0

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

+0

Существует, как указано в ответе. Просто ожидайте больше боли, если у вас есть другие манипуляции с датой и временем. –

+0

Не помогает. Форматировщик всегда выплевывает время в GMT, а не запрошенный CDT. –

2

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

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

выходы:

Wed Jul 08 12:08:48 CDT 2009 

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

2

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

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

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

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

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

1

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

ZonedDateTime

Укажите шаблон форматирования, чтобы соответствовать вашей входной строки. Коды аналогичны SimpleDateFormat, но не совсем. Обязательно прочтите класс doc для 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]

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

Укажите proper time zone name в формате 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. Для этого экстракта Instant. Класс Instant представляет собой момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).

Этот класс Instant является базовым классом строительного блока java.time. Вы можете представить ZonedDateTime как Instant плюс ZoneId.

Instant instant = zdtChicago.toInstant(); 

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


О java.time

java.time каркас встроен в Java 8 и позже. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Проект Joda-Time, теперь в maintenance mode, советует перейти на java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск 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-Backport.
  • Android
    • Проект ThreeTenABP адаптирует ThreeTen-Backport (как упоминалось выше) для Android специально.
    • См. How to use….

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