2016-12-09 2 views
0

я получаю временные метки в виде строки в потоке, и они имеют формата "2016-12-08 05:44:48 <timezone like IST, UTC>" и "2016-12-08 05:44:48 <timezone like +0000>"SimpleDateFormat синтаксического анализ изменение времени в соответствии с часовым поясом

Я хочу, чтобы преобразовать строку в java.sql.Timestamp, так что я написал функцию следующим

private static Timestamp convertToTimestamp(String s) throws ParseException{ 
    String dateFormat = new String("yyyy-MM-dd hh:mm:ss z"); 
    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); 
    Date d = sdf.parse(s); 
    return new Timestamp(d.getTime()); 
} 

Когда я бегу

Timestamp t = convertToTimestamp("2016-12-08 05:44:48 UTC"); 
System.out.println(t); 

выход 2016-12-08 11:14:48.0

Он автоматически преобразуется в IST (возможно, мой JVM по умолчанию). Как сделать изменение так, чтобы время выхода не менялось на IST и такое же, как на входе?

ответ

1

Явы java.util.Date и java.sql.Timestamp не храним часовой пояс.

Они всегда отслеживают время в UTC.

При анализе строки даты, содержащей часовой пояс, строка правильно разобрана и отредактирована с данного часового пояса на UTC.

При анализе строки даты без часового пояса строка анализируется в часовой пояс JVM по умолчанию и преобразуется в UTC, если только другой часовой пояс явно не указан синтаксическому анализатору даты (обычно SimpleDateFormat).

Когда отображения (ака форматирование) в Date/Timestamp, он будет показан в часовом поясе, виртуальная машина по умолчанию, если не указано иное.

В Date/Timestamp объектов не магазина часового пояса, так что они не могут вспомнить, что исходный часовой пояс был.

Если вам это нужно, используйте Java 8's ZonedDateTime.

1

Вы должны игнорировать часовой пояс при разборе даты

new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 
Смежные вопросы