Java日期时间戳转换问题

时间:2016-07-25 14:32:35

标签: java

我在java中进行简单的String to date转换,只有一件事我必须小心转换应该是GMT。 我能够在GMT中转换我的字符串。但是当我试图将该日期转换为时间戳时,我得到了不同的值(似乎值基于我当地的时区)。

    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)

}

3 个答案:

答案 0 :(得分:2)

Timestamp.toString()在内部使用带有默认系统时区的日历实例。正如你在源代码java.util.Date.normalize()中看到的那样神奇。 所以,是的......最后一次系统输出基于您当地的时区。

答案 1 :(得分: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 );

Stack Overflow已经多次覆盖了所有这些。

答案 2 :(得分: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());

  }