2013-02-15 2 views
2

Я видел несколько таких вопросов, но я не могу получить правильное преобразование. Я хочу, чтобы преобразовать дату как следующийJava Convert TimeZone

20121116203036Z

в

2012-11-16 15:30:36

Я следующий код

dateStringTime.set(year, mon-1 , day, hour, minute, second); 

    Date date = dateStringTime.getTime(); 

    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    formatter.setTimeZone(TimeZone.getTimeZone("EST")); 

    String output = formatter.format(); 
    return output; 

который работает, но он дает мне ниже

2012-11-16 20:30:36

Любые советы о том, как получить вместо ?

ответ

1

TimeZone. getDefault() предоставит часовой пояс времени выполнения. Если вы удалите getRawOffet значение от date, у вас будет UTC. еще один шаг, чтобы добавить/удалить значение EST из от UTC и делается Конверсия

+0

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

1

Во-первых, ваш код не форматирование «дата», попробуйте следующее:

String output = formatter.format(date); 

Я также заметил, вы не показывая нам, как вы создаете dateStringTime, который я считал Calendar. Я заметил, что метод Calendar.getInstance() также принимает Locale, который может повлиять на часовой пояс.

Мой код:

Calendar dateStringTime = Calendar.getInstance(); 

    //convert 20121116203036Z  
    int year = 2012; 
    int mon = 11; 
    int day = 16; 
    int hour = 20; 
    int minute = 30; 
    int second = 36; 

    dateStringTime.set(year, mon-1 , day, hour, minute, second); 

    Date date = dateStringTime.getTime(); 

    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    formatter.setTimeZone(TimeZone.getTimeZone("EST")); 

    String output = formatter.format(date); 
    System.out.println(output);  

Мой выход:

2012-11-16 21:30:36 

Вы заметили, что час 1 час? Это потому, что я в Центральном часовом поясе, и JVM учитывает это, когда я прошу «EST». Он считает, что исходное время находится в текущем часовом поясе.

, что происходит, когда вы закомментировать

 //formatter.setTimeZone(TimeZone.getTimeZone("EST")); 
+0

Когда я делаю это, я получаю ... 2012-11-17 01:30:36 –

+0

Подсказка: код следующий "convert 20121116203036Z" * не делает это *. –

0

Ваша проблема заключается в том, что вы вводите дату в неверном часовом поясе. Когда вы сделаете это

dateStringTime.set(year, month-1 , day, hour, minute, second); 

нужно вводить дату, используя часовой пояс по умолчанию, которое вряд ли в вашем случае, чтобы быть UTC. Под обложками Java Date представлен как UTC, поэтому перевести дату/время на UTC, а не вводить непосредственно в UTC.

В основном, это делает следующую последовательность часовых поясов переводов: EST -> UTC -> EST

Если вы собираетесь указать дату/время, используя UTC, вы должны сделать это:

dateStringTime.setTimeZone(TimeZone.getTimeZone("UTC")); 
dateStringTime.set(year, month-1 , day, hour, minute, second); 

Тогда вы будете двигаться только от UTC -> EST, и вы должны получить правильный результат.

0

Т.Л., д-р

OffsetDateTime.parse(
    "20121116203036Z" , 
    DateTimeFormatter.ofPattern("yyyyMMddHHmmssX") 
).toLocalDateTime() 
.toString() 
.replace("T" , " ") 

java.time

В java.time классы, встроенные в Java сделать это легко. Избегайте трудных старых классов времени, таких как Date & DateFormat, теперь наследие.

String input = "20121116203036Z"; 
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyyMMddHHmmssX"); 
OffsetDateTime odt = OffsetDateTime.parse(input , f); 

odt.toString(): 2012-11-16T20: 30: 36Z

Чтобы получить вывод, который вы могли бы определить пользовательские DateTimeFormatter. Ленецкий способ состоит в том, чтобы преобразовать в LocalDateTime, просто чтобы потерять Z на конце, что указывает на смещение-от-UTC (Z сокращенно на Zulu и означает UTC). Затем используйте toString, чтобы сгенерировать строку в формате ISO 8601, за исключением замены T посередине пробелом.

String output = odt.toLocalDateTime().toString().replace("T" , " "); 

2012-11-16 20:30:36

См live code in IdeOne.com.

ISO 8601

Я предлагаю, а не использовать свой формат для таких значений даты и времени, вместо того, чтобы использовать ISO 8601 стандартные форматы. Обычный формат для такого значения - 2016-11-16T02:45:02Z. Обратите внимание на T в среднем отделянии год-месяц-день с часа-минуты-секунды. В качестве альтернативы стандарт позволяет свести к минимуму использование сепараторов, считающихся «базовой» версией: 20161116T024502Z, но сохраняет T посередине.

Классы java.time могут анализировать и генерировать расширенные версии, но не базовую версию.


О java.time

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

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

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

Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport и дополнительно выполнен с возможностью Android в ThreeTenABP (см How to use…).

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