我在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)
}
答案 0 :(得分:2)
Timestamp.toString()在内部使用带有默认系统时区的日历实例。正如你在源代码java.util.Date.normalize()中看到的那样神奇。 所以,是的......最后一次系统输出基于您当地的时区。
答案 1 :(得分:2)
亚历山大的回答是正确的。
这些旧的日期时间课程非常混乱。正如他们的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());
}