【发布时间】:2025-12-29 19:50:14
【问题描述】:
我正在尝试创建一个日期对象,其时间表示不同时区的日期时间。可能吗?我试过这个。有人可以解释一下这里出了什么问题。
public static void test3() {
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("America/New_York"));
Date d1 = calendar.getTime();
System.out.println("d1= " + d1);
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a z");
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
String dateInString = sdf.format(calendar.getTime());
System.out.println("dateInString= " + dateInString);
try {
Date d2 = sdf.parse(dateInString);
System.out.println("d2= " + d2);
}
catch (ParseException e) {
e.printStackTrace();
}
}
输出:
d1= Thu Jan 21 17:26:20 IST 2016
dateInString= Jan 21, 2016 06:56:20 AM EST
d2= Thu Jan 21 17:26:20 IST 2016
更新:
如果我不关心时区而只需要时间,我有一个 Date 对象,它显示错误时区的时间。使用了一个新的 SDF 实例
public static void test3() {
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("America/New_York"));
Date d1 = calendar.getTime();
System.out.println("d1= " + d1);
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a");
SimpleDateFormat sdf2 = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a");
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
String dateInString = sdf.format(calendar.getTime());
System.out.println("dateInString= " + dateInString);
try {
Date d2 = sdf2.parse(dateInString);
System.out.println("d2= " + d2);
}
catch (ParseException e) {
e.printStackTrace();
}
}
输出:
d1= Thu Jan 21 18:36:51 IST 2016
dateInString= Jan 21, 2016 08:06:51 AM
d2= Thu Jan 21 08:06:51 IST 2016
enter code here
【问题讨论】:
-
如果您使用 Java 8,请查看新的 date+time API。
-
@ThorbjørnRavnAndersen 我在 Java 7 中
-
谁能解释一下这里出了什么问题:没有什么问题。你期望会发生什么? Date 只是几毫秒的包装器。它没有任何时区。
-
我认为您对时间(或日期)的概念和时间的表示感到困惑。随着 Locale 的变化,日期的表示会发生变化,但 Date 对象表示的实际值不会发生变化。当您执行 SOP 时,您实际上是在使用默认语言环境格式化 Date 对象。
-
@JBNizet 这是否意味着您创建了一个 java.Util.Date 对象,该对象表示与JVM所在系统的时区不同的日期时间?