这是我之前question之一的延续,我无法解析现在解决的日期。在下面的代码中,我有一个日期字符串,我知道日期字符串的时区,即使字符串本身不包含它。然后我需要将日期转换为EST时区。
String clientTimeZone = "CST6CDT";
String value = "Dec 29 2014 11:36PM";
value=StringUtils.replace(value, " ", " ");
DateTimeFormatter df = DateTimeFormat.forPattern("MMM dd yyyy hh:mma").withZone(DateTimeZone.forID(clientTimeZone));
DateTime temp = df.parseDateTime(value);
System.out.println(temp.getZone().getID());
Timestamp ts1 = new Timestamp(temp.getMillis());
DateTime date = temp.withZoneRetainFields(DateTimeZone.forID("EST"));//withZone(DateTimeZone.forID("EST"));
Timestamp ts = new Timestamp(date.getMillis());
System.out.println(ts1+"="+ts);
当我运行代码时,我希望ts1保持相同,并且ts将增加1小时。但我已经低于我不明白的地方了。我认为EST比CST提前一小时,所以如果它在CST中是11,那么它应该是美国东部时间的12。似乎也有大约十一个半小时的抵消。关于我所缺少的任何线索。
2014-12-30 11:06:00.0=2014-12-30 10:06:00.0
答案 0 :(得分:0)
我认为以下代码可以帮助您。
String clientTimeZone = "CST6CDT";
String toStimeZone = "EST";
String value = "Dec 29 2014 11:36PM";
TimeZone fromTimeZone = TimeZone.getTimeZone(clientTimeZone);
TimeZone toTimeZone = TimeZone.getTimeZone(toStimeZone);
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(fromTimeZone);
SimpleDateFormat sf = new SimpleDateFormat("MMM dd yyyy KK:mma");
Date date = sf.parse(value);
calendar.setTime(date);
System.out.println(date);
calendar.add(Calendar.MILLISECOND, fromTimeZone.getRawOffset() * -1);
if (fromTimeZone.inDaylightTime(calendar.getTime())) {
calendar.add(Calendar.MILLISECOND, calendar.getTimeZone().getDSTSavings() * -1);
}
calendar.add(Calendar.MILLISECOND, toTimeZone.getRawOffset());
if (toTimeZone.inDaylightTime(calendar.getTime())) {
calendar.add(Calendar.MILLISECOND, toTimeZone.getDSTSavings());
}
System.out.println(calendar.getTime());
答案 1 :(得分:0)
方法withZoneRetainFields()保留时区CST(= UTC-06)中的字段,因此您的本地时间戳(为LocalDateTime
),但将其与不同的时区(EST = UTC-05)组合在一起在偏移中提前一小时,导致不同的瞬间。你应该这样解释它:与芝加哥相比,在纽约一小时前发生同样的当地时间。
规则是减去正偏移并添加负偏移,以使时刻的时间戳表示具有可比性(标准化为UTC偏移)。
另外:也许你不想要这个,但想要保留即时而不是本地字段。在这种情况下,您必须使用方法withZone()。
旁注:有效地,您比较变量temp
和date
所代表的瞬间,最后使用您的默认时区在JDBC-escape-中打印这些瞬间 - 格式(解释 - 您隐式使用Timestamp.toString()
)。我宁愿建议为此目的使用专用的即时格式化程序或更简单(使焦点具有焦点):
System.out.println(temp.toInstant() + " = " + date.toInstant());