2016-07-25 3 views
2

Я делаю простой Преобразование строк на дату в java, Только одно, что я должен позаботиться о преобразовании, должно быть в GMT. Я могу преобразовать свою строку в GMT. Но когда я попытался преобразовать эту дату во временную метку, у меня получилось другое значение (значение value основано на моем локальном часовом поясе).Ошибка преобразования даты по дате Java

public static void timeFun(String str) throws ParseException { 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
    String dateInString = "2015-07-10T09:54:31.000-04:00"; 
    Date date = formatter.parse(dateInString); 

    SimpleDateFormat sdfAmerica = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
    TimeZone tz = TimeZone.getTimeZone("GMT"); 
    sdfAmerica.setTimeZone(tz); 

    String convertedDate = sdfAmerica.format(date); // Convert to String 
                // first 
    Date dateInGMT = sdfAmerica.parse(convertedDate); 
    System.out.println(convertedDate); // Output = 2015-07-10T13:54:31.000Z (Right) 
    Timestamp timestamp = new java.sql.Timestamp(dateInGMT.getTime()); 

    System.out.println(timestamp); // Output = 2015-07-10 19:24:31.0 (Wrong) 

} 
+0

на дату и Timestamp классы не имеют часовой пояс - они представляют собой лишь ряд Миллисекунды эпохи. Их метод toString может делать некоторые преобразования на основе настроек вашего компьютера, но не влияет на внутреннее состояние объектов. Если вы используете временную метку, вы, вероятно, хотите взаимодействовать с БД, и результат должен быть таким, каким вы ожидали бы (13: 54GMT или какой-то эквивалентный момент времени), если в столбце базы данных есть часовой пояс. – assylias

ответ

0

Этот код работает отлично для меня:

public static Timestamp convertStringToTimestamp(String strRaw) throws ParseException 
    { 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
    String dateInString = strRaw; 
    Date date = formatter.parse(dateInString); 
    TimeZone gmtTime = TimeZone.getTimeZone("GMT"); 
    formatter.setTimeZone(gmtTime); 
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
    calendar.setTime(date); 
    SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 

    Timestamp t = new Timestamp(formatter1.parse(formatter.format(calendar.getTime())).getTime()); 

    System.out.println("********"+new Date(t.getTime())); 
    return new Timestamp(formatter1.parse(formatter.format(calendar.getTime())).getTime()); 

    } 
2

Timestamp.toString() внутренне использует экземпляр календаря с По умолчанию System Timezone. Как вы можете видеть в Исходном коде java.util.Date.normalize() делает магию. Итак, да ... Последний выход системы основан на вашем локальном часовом поясе.

2

Ответ Александра правильный.

java.time

Этих старых классов даты и время является ужасным беспорядком. Избегайте их, как это предлагается в их JavaDoc. Они были заменены рамкой java.time.

OffsetDateTime odt = OffsetDateTime.parse("2015-07-10T09:54:31.000-04:00"); 

Чтобы получить UTC (GMT), извлечь Instant.

Instant instant = odt.toInstant(); 

Чтобы увидеть один и тот же момент через призму конкретного часового пояса, нанесите ZoneId.

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(zoneId); 

Все это было много раз покрыто переполнением стека.

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