【发布时间】:2020-03-02 15:17:54
【问题描述】:
我正在尝试根据机场在 Date 对象上设置时区。 当我再次将其从 String 解析为 date 时,它会将时区从 EST 重置为本地时区 CST。
private Date formatDate(final Date date, final FlightStop stop) {
DateFormat sdf = new SimpleDateFormat("MM/dd/yy hh:mm aa zzz");
sdf.setTimeZone(TimeZone.getTimeZone(stop.getAirport().getTimeZone().getID()));
try {
LOG.debug("before parsing -> sdf.format(date) : " + sdf.format(date)); //03/03/20 10:45 AM EST
LOG.debug("after parsing -> sdf.parse(sdf.format(date)) : " + sdf.parse(sdf.format(date))); //after parsing Tue Mar 03 09:45:00 CST
return sdf.parse(sdf.format(date));
} catch (Exception e) {
return new Date();
}
}
更新: 方法调用:
public void sendMessage(final Date endingStopDate, final FlightStop endingStop) {
Date endDate = formatDate(endingStopDate, endingStop);
traveler.setDate(endDate);
【问题讨论】:
-
把代码贴在你调用那个方法的地方。
-
Date& company 是一个丑陋的烂摊子,带有不直观的 API 和在单个类中混合不相关的信息。是否可以选择使用java.time包?它可能很复杂,但它与时间和日期一样复杂,仅此而已...... -
我建议你不要使用
Date和SimpleDateFormat。这些类设计不佳且早已过时,后者尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time API 的ZonedDateTime和ZoneId。也不要依赖三个字母的时区缩写,它们通常是模棱两可的,而且往往不是真正的时区。