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