【发布时间】:2016-04-19 15:27:56
【问题描述】:
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class Test001 {
public static void main(String[] args) {
Date dt = new Date();
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS zzz").withZone(ZoneId.of("America/New_York"));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS zzz");
System.out.println(formatter.format(localDateTime));
System.out.println(sdf.format(dt));
}
}
输出
2016-04-19 11:25:34.917 ET
2016-04-19 11:25:34.637 EDT
我的笔记本电脑的时区是“美国/纽约”(即美国/加拿大东部时间)。
我想知道如何使用 DateTimeFormatter 来获得“EDT”而不是“ET”。
我也很想知道:为什么DateTimeFormatter 在解析/格式模式方面与SimpleDataFormat 不兼容(因为这个例子表明它们不兼容)。
【问题讨论】:
-
@Mr.Polywhirl 好的,但是也有很多遗留代码。我们可能希望保留旧格式。
-
从技术上讲,“美国/纽约”不是 EDT,而是 ET。目前恰好也是 EDT,但冬天将是 EST。所以它们显然是不等价的。
-
@assylias 无意冒犯,但我不在乎它在技术上是什么。我关心我有大量生成 EST/EDT 的 Java 6,7 代码,现在我不知道如何使用 Java 8 的 java.time 生成相同的代码。我认为 java.time 将与旧方式兼容(至少就格式和解析而言)。
-
@peter.petrov 我理解 - 我的意思是 EDT(或 EST)不是真正的时区 - 这就是它们不可用的原因。因此,您可能必须坚持使用日期或手动更改时区(例如检查 dst 是否打开)。其他人可能有一个解决方案......