2015-05-15 2 views
0

Использование Joda, как вы форматируете UTC +/- н время, чтобы "время стена", которая будет отображаться для пользователя:UTC-Н Время

С (UTC +/- N):

2015-05-15T03:28:49.523-04:00

К (EST) стены:

2015-05-14 23:22:44

Update (1)

Обратите внимание на следующий код. Нам нужна отметка времени для записи в БД и из базы данных в формате UTC. Имея это в виду:

DateTimeZone.setDefault(DateTimeZone.UTC); 
LocalDateTime utcDate = new LocalDateTime(); 
DateTimeZone utcTZ = DateTimeZone.forTimeZone(TimeZone.getTimeZone("ETC/UTC")); 
DateTimeZone localTZ = DateTimeZone.forTimeZone(TimeZone.getTimeZone("America/Montreal"));  
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");   
fmt.withZone(localTZ); 

DateTime localDateTime = utcDate.toDateTime(localTZ); 
DateTime utcDateTime = localDateTime.toDateTime(utcTZ); 

Timestamp u = new Timestamp(utcDateTime.getMillis()); 

System.out.println("UTC Time: " + u); 

LocalDateTime date = new LocalDateTime(u); 
DateTime srcDateTime = date.toDateTime(utcTZ); 
DateTime dstDateTime = srcDateTime.toDateTime(localTZ); 

System.out.println("UTC+/- Time: " + dstDateTime.toString()); 

DateTime dateTimeInTargetTimezone = dstDateTime.withZone(localTZ); 
System.out.println("Wall Time: " + dateTimeInTargetTimezone.toString("yyy-MM-dd HH:mm:ss"));  

Теперь, когда извлекая время UTC из БД в объект Timestamp, нам нужно для отображения времени для конечного пользователя в «Wall/Funeral Time», что вы хотите называть его, в их ТЗ.

Выход

UTC Time: 2015-05-15 20:03:47.561 "Good" 
UTC+/- Time: 2015-05-15T20:03:47.561-04:00 "Good" 
Wall Time: 2015-05-15 20:03:47 "No! No! No! Danger! We'll be late!" 

Что в имени! Должен ли я сделать, чтобы получить dstDateTime, чтобы сравнять время, которое я вижу на своей стене (то есть, 2015-05-15 4:03:47).

Update (2)

Избавился Timestamp:

DateTimeZone utcTZ = DateTimeZone.forTimeZone(TimeZone.getTimeZone("ETC/UTC")); 
DateTimeZone localTZ = DateTimeZone.forTimeZone(TimeZone.getTimeZone("America/Montreal")); 
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyy-MM-dd HH:mm:ss"); 

LocalDateTime utcDate = new LocalDateTime(utcTZ); 
DateTime utcDateTime = utcDate.toDateTime(utcTZ);  

System.out.println("UTC Time: " + utcDateTime); 

DateTime dstDateTime = utcDateTime.toDateTime(localTZ); 

System.out.println("Unformated Wall Time: " + dstDateTime); 
System.out.println("Wall Time: " + dstDateTime.toString(fmt)); 

Выход однако

UTC Time: 2015-05-20T14:09:28.469Z 
Unformated Wall Time: 2015-05-20T10:09:28.469-04:00 
Wall Time: 2015-05-20 10:09:28 

Все выглядит идеально, когда я пытаюсь исправить дату UTZ к БД , Мне нужно преобразовать в Timestamp (то есть новую отметку времени (o.getOrderDate(). GetMillis())), и она, очевидно, права loca l время для БД, а не UTC Zulu время, которое мне нужно.

Thanks in Advance,

Nick.

+0

Я также хотел бы поставить «время стены» 2015-05-14 23:22:44 в объект Timestamp. –

+0

Ваши комментарии о конверсиях в вашем обновлении не имеют смысла. Во-первых, вы печатаете «UTC time» и вывод java.sql.Timestamp.toString, но этот вывод не находится в UTC, он находится в вашем локальном часовом поясе.Который будет установлен TimeZone.setDefault, который вы не вызываете (хотя вы вызываете DateTimeZone.setDefault, поэтому Joda-Time имеет другой часовой пояс по умолчанию для java.util.Date). Установите оба значения по умолчанию для UTC, и выходы должны иметь больше смысла. – araqnid

+0

Привет, Аракнид! Большое вам спасибо, что сейчас гораздо больше присылают. Посмотрите мое обновление выше. –

ответ

0

@Nick

Я не уверен, если я правильно понял ваш вопрос, но вы можете попробовать это:

//sample input 
    String timestamp = "2015-05-15T03:28:49.523-04:00"; 

    //format to parse 
    DateTimeFormatter dateTimeF = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
    //parse to local date time 
    LocalDateTime dateTime = dateTimeF.parseLocalDateTime(timestamp).minusHours(4); 
    //output here minus 4 hours 
    System.out.println(dateTime); 

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

Goodluck!

+0

Благодарим за отзыв. Мои вопросы: как получить фактическое время TZ с UTC +/- n (т. Е. UTC-4, UTC + 5). У меня есть следующее время: «2015-05-15T03: 28: 49.523-04: 00» и хотел бы отформатировать его до «2015-05-14 23:22:44» для отображения пользователю. –

0

Просто используйте метод DateTime.withZone для изменения часового пояса:

@Test 
public void change_timezone() { 
    String input = "2015-05-15T03:28:49.523-04:00"; 
    DateTimeZone targetTimeZone = DateTimeZone.forID("Europe/London"); 
    DateTime dateTime = DateTime.parse(input); 
    DateTime dateTimeInTargetTimezone = dateTime.withZone(targetTimeZone); 
    assertThat(dateTimeInTargetTimezone.toString("yyy-MM-dd HH:mm:ss"), 
       equalTo("2015-05-15 08:28:49")); 
} 
+0

Привет, Araqnid, Спасибо за ваш ответ. Я делаю это, но получаю неправильное время. Не могли бы вы увидеть мое обновление выше. –

Смежные вопросы