【问题标题】:java.Util.Date object with date of different timezone [duplicate]具有不同时区日期的java.Util.Date对象[重复]
【发布时间】: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所在系统的时区不同的日期时间?

标签: java date


【解决方案1】:

试试这个:

Date date = Calendar.getInstance().getTime();
SimpleDateFormat sdfAmerica = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a");
sdfAmerica.setTimeZone(TimeZone.getTimeZone("America/New_York"));
String sDateInAmerica = sdfAmerica.format(date);

【讨论】:

  • 您正在将日期格式化为不同的时区,我已经准备好了,我想要一个 Date 对象
  • 不能是日历对象吗?
【解决方案2】:

Date 旨在存储 UTC 时间(请参阅docs)。如果您想在不同的时区有时间并且不想格式化,我建议您使用Calendar 对象(请参阅docs)。

对于作为 Java 7 开发人员的你:一般来说,我建议使用 Calendar 对象而不是 Date 对象,因为更容易操作(例如添加时间)和更直观的 api。

【讨论】:

    【解决方案3】:

    你可以通过以下方式解决这个问题

    SimpleDateFormat sdfAmerica = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a");
    sdfAmerica.setTimeZone(TimeZone.getTimeZone("America/New_York"));
    Date newDate = sdfAmerica.parse(sdfAmerica.format(Calendar.getInstance().getTime()));
    

    【讨论】:

      最近更新 更多