【发布时间】:2020-05-07 15:58:14
【问题描述】:
这里是Java 8,我有以下代码:
public class PossibleBug {
public static void main(String[] args) {
new PossibleBug().run();
}
public void run() {
buildDate("20181205");
}
public Date buildDate(final String yyyyMmDd) throws ParseException {
TimeZone expectedTz = TimeZone.getTimeZone("America/New_York");
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.setTimeZone(expectedTz);
TimeZone actualTz = sdf.getTimeZone();
Date answer = sdf.parse(yyyyMmDd);
return answer;
}
}
非常基本的东西:
- 创建一个
SimpleDateFormat并将其时区设置为 EST - 使用 SDF 解析日期字符串
- 结果应该也是 EST 中的日期
不过在运行时,看看调试器的结果:
这怎么可能?!?! sdf.parse(yyyyMmDd) 正在返回一个 GMT 格式的日期。是我遗漏了什么还是SimpleDateFormat 中的错误?
我能够调用 buildDate 并从不同的类中运行它,它似乎工作正常:
【问题讨论】:
-
您已明确标记为 [java-8],因此不要使用
Date和SimpleDateFormat。使用来自java.time的类。 -
这对我来说很好用。输出为
Wed Dec 05 00:00:00 EST 2018。所以你的环境有问题。 -
05.12.2018 00:00 解释为在 America/New_York 在您的示例中打印为 GMT 05:00。
-
我建议你不要使用
TimeZone、SimpleDateFormat和Date。这些类设计糟糕且过时,SimpleDateFormat特别是出了名的麻烦。而是使用ZoneId、LocalDate和DateTimeFormatter,均来自java.time, the modern Java date and time API。
标签: java java-8 simpledateformat