【问题标题】:What is the default timezone for java.util.Calendar.?java.util.Calendar 的默认时区是什么?
【发布时间】:2013-12-09 12:53:15
【问题描述】:

代码

public String testDate(){ 
      TimeZone.setDefault(TimeZone.getTimeZone("US/Eastern"));
      Calendar fromDate = Calendar.getInstance();
      Date date= new Date();
      System.out.println(fromDate);
      System.out.println(date);
}

在调试下面的日历变量时,我的日历变量显示 cdate 值 2013-12-09T00:00:00.000Z 和时间值 1386649779590

Calendar cal = Calendar.getInstance();

我在打印对象时看到的完整日历详细信息

System.out.println(cal);

控制台

java.util.GregorianCalendar[time=1386649779590,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="US/Eastern",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=US/Eastern,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]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2013,MONTH=11,WEEK_OF_YEAR=50,WEEK_OF_MONTH=2,DAY_OF_MONTH=9,DAY_OF_YEAR=343,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=11,HOUR_OF_DAY=23,MINUTE=29,SECOND=39,MILLISECOND=590,ZONE_OFFSET=-18000000,DST_OFFSET=0]

虽然我的 java.util.date 变量将日期显示为 Mon Dec 09 07:37:50 EST 2013,但在调试日期变量时

Date date= new Date();

我设置的默认 timezoneEST 在程序启动时指定的

TimeZone.setDefault(TimeZone.getTimeZone("US/Eastern"));

我在 timezone IST 工作。

我的问题是

为什么CalendarcalDate()date 不同?

【问题讨论】:

  • 很难理解你的问题。您可以拨打getTimeZone 轻松查看日历的时区。如果这不能为您提供足够的信息,请发布一个简短但完整的程序来演示该问题。当我们不知道您如何看待该值时,我们不知道您所说的“我的日历变量将时间显示为 [...]”是什么意思。
  • @JonSkeet 我已经发布了我检查过的结果。但我没有得到时区
  • “我已经发布了我检查过的结果”是什么意思?在哪里?你的整个问题很难理解。
  • @JonSkeet 2013-12-09T00:00:00.000Z 这是我在调试 Calendar 变量时发现的值
  • 我只想说,在任何时区中,纪元 1386592669972 都不等于 2013-12-09T00:00:00.000Z。纪元 1386592669972 是 2013-12-09T12:37:49.972Z。您需要准确显示您如何看待第一次约会 - 调试器或toString() 或什么。 SSCCE 最好。

标签: java date calendar


【解决方案1】:

根据Oracle Documentation明确提到,

公共静态日历 getInstance()
获取使用默认时区和语言环境的日历。返回的日历基于具有默认语言环境的默认时区中的当前时间。

default time zone 是由public static TimeZone getDefault() 获得的,在TimeZone.getDefault() 中提到

获取此主机的默认时区。默认时区的来源可能因实现而异。

它将返回您计算机中设置的default 时区,除非您使用public static void setDefault(TimeZone zone) 函数明确设置TimeZone

我相信上面的解释回答了你的两个问题,

  1. java.util.Calendar. 的默认时区是什么?
  2. 为什么我的日历类型变量 cal 显示的时间不是 IST 或 EST。?

编辑:根据您编辑的问题

为什么 Calendar 的 cal 和 Date() 的日期不同?

当您调用System.out.println(date); 时,会调用toString() 函数,如果您查看Source Code of Date,您会发现它通过调用默认时区的displayName 函数(即3 个字母)返回时区的3 个字母简写在你的情况下速记EST,即U.S. Eastern Standard Time (GMT-05:00) Indiana (East)

【讨论】:

  • Okie第一部分已经解决了,但是为什么调试时显示的两个日期不一样?
【解决方案2】:

日期本身没有任何时区。是toString()方法使用当前默认时区返回一个String

【讨论】:

    【解决方案3】:

    通常,您会使用getDefault 获得TimeZone,它会根据程序运行的时区创建TimeZone。例如,对于在日本运行的程序,getDefault 根据日本标准时间创建一个 TimeZone 对象。

    查看TimeZone了解更多信息

    【讨论】:

    • 是的,时区是默认值,日期使用,但日历和日期不同,它们使用不同的时区值
    • @Dileep:不,他们真的没有。如果你相信他们这样做,你应该在一个简短但完整的程序中证明这一点,就像我之前问过的那样。
    【解决方案4】:

    您提到“cdate”,我注意到 Calendar 对象中有一个名为 cdate 的字段。在运行您的示例代码时,我看到 cdate 字段确实已初始化为 2013-12-10T00:00:00.000Z(当然现在是 24 小时后)。

    所以?我不知道你为什么要查看一个类的内部字段,而你永远不会直接使用它们。

    那么,您的解决方案就是忽略它。不用担心日历的 cdate 字段;担心实际影响您的程序的事情。

    CalendartoString() 不是很漂亮,是用来调试的;你应该打电话给cal.getTime(),它会给你一个java.util.Date,然后你可以直接或使用java.text.DateFormatter打印出来。

    【讨论】:

      猜你喜欢
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 2014-01-07
      • 1970-01-01
      相关资源
      最近更新 更多