Java日期时间戳转换问题

Java日期时间戳转换问题,java,Java,我正在用java进行简单的字符串到日期的转换,只有一件事我必须注意转换应该是在GMT中。 我可以用GMT转换字符串。但当我试图将该日期转换为时间戳时,我得到了不同的值(该值似乎基于我的本地时区) 在内部使用具有默认系统时区的日历实例。正如您在源代码中看到的那样,这是一个神奇的过程。 所以,是的。。。最后一次系统输出基于您的本地时区。Alexander的回答是正确的 public static void timeFun(String str) throws ParseException {

我正在用java进行简单的字符串到日期的转换,只有一件事我必须注意转换应该是在GMT中。 我可以用GMT转换字符串。但当我试图将该日期转换为时间戳时,我得到了不同的值(该值似乎基于我的本地时区)

在内部使用具有默认系统时区的日历实例。正如您在源代码中看到的那样,这是一个神奇的过程。
所以,是的。。。最后一次系统输出基于您的本地时区。

Alexander的回答是正确的

    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)

}
java.time 这些旧的约会时间课程乱七八糟。正如JavaDoc中建议的那样,避免使用它们。它们已经被java.time框架所取代

OffsetDateTime odt = OffsetDateTime.parse( "2015-07-10T09:54:31.000-04:00" );
要获取UTC(GMT),请提取一个
瞬时值

Instant instant = odt.toInstant();
要通过特定时区的镜头看到同一时刻,请应用
ZoneId

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

所有这些都在堆栈溢出中被多次讨论。

这段代码对我来说运行良好:

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());

  }

Date和Timestamp类没有时区-它们只表示自纪元以来的毫秒数。他们的toString方法可能会根据您机器的设置进行一些转换,但不会影响对象的内部状态。如果使用时间戳,您可能希望与DB交互,并且如果您的数据库列具有时区,则结果应该与您预期的一样(13:54GMT或某个等效时间)。