【问题标题】:Setting Timezone with Calender in java在java中使用日历设置时区
【发布时间】:2015-02-03 21:03:48
【问题描述】:

我试图更改 TimeZone 使用 Calendar 类,我发现我应该使用 DateFormat 而不是在 Calendar 对象上设置时区。 现在,我找到了更改时区的解决方法。

但是当我玩日历时,我仍然对输出感到困惑......

    public static void main(String[] args) {
    Calendar cal = Calendar.getInstance();
    System.out.println("Time Zone : " + cal.getTimeZone()); // Default Time Zone
    System.out.println("Date : " + cal.getTime());
    System.out.println("------------Setting Time zone to IST------------");
    cal.setTimeZone(TimeZone.getTimeZone("IST")); // Setting Time Zone to IST
    System.out.println("Time Zone : " + cal.getTimeZone());
    System.out.println("Date : " + cal.getTime());
}

输出:

Time Zone : sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]
Date : Fri Dec 05 10:45:56 EST 2014
------------Setting Time zone to IST------------
Time Zone : sun.util.calendar.ZoneInfo[id="IST",offset=19800000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null]
Date : Fri Dec 05 10:45:56 EST 2014

这是我的问题

在我打印 cal.getTimeZone() 时设置时区后,它会将时区更改为 IST(这是理想情况)。但是当我打印 cal.getTime()它仍然在 EST)时,为什么它不影响日期?

P.S.:我想知道这背后的原因,我对学习如何更改时区不感兴趣!

谢谢!!

【问题讨论】:

    标签: java date calendar timezone date-format


    【解决方案1】:

    cal.getTime() 仍在打印 EST 的原因是因为 java 的 Date 对象(这是 cal.getTime() 返回的)不包含时区信息

    Date 对象的字符串表示具有误导性,因为它包含您计算机的时区(在您的情况下为 EST)。我住在俄勒冈州,所以如果我要运行你的代码,我会得到 PST。但是尽管有这种 String 表示,Date 对象中没有任何 TimeZone 字段。

    在您的代码中,您已成功设置日历的 TimeZone,但不幸的是,当您从日历中提取 Date 对象时,您无法使用它获取 TimeZone。

    您可能会问,为什么 Java 的创建者会这样做?好吧,没有什么好的答案,除了这是一个糟糕的决定,也解释了为什么在 Java 8 中他们制作了一个全新的库来处理日期/时间。

    还应注意DateFormat 对象确实包含 TimeZone 字段,因此您可以使用它来打印特定时区的时间。见How to set time zone of a java.util.Date?

    【讨论】:

    • @aadi53 添加了更多信息。
    • 我知道如何使用 DateFormat 设置时区。我对带有日历的时区感到困惑。我从没想过 Date 没有时区字段,但现在一切都清楚了!谢谢。
    • 我只是想在这里添加一些东西,Date 类有 getTimezoneOffset() 方法,它以分钟为单位将时区偏移量返回到 UTC,但这种方法已被弃用!!如果有人感兴趣
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2010-09-18
    • 2015-10-15
    相关资源
    最近更新 更多