当前位置: 首页 > 知识库问答 >
问题:

为什么日历以正确的时区返回错误的时间?

商佑运
2023-03-14


返回的时间和日期均正确,但小时比应为少1小时。

我似乎正在设置获取正确时间和日期所需的所有内容:

 - I'm using Calendar.getInstance(), instead of new Date()
 - I'm setting the timezone of the Calendar instance with Timezone.getTimeZone
 - I'm using DateFormat and SimpleDateFormat to format the output


我的时区是东部标准时间,又名UTC/GMT-5:00。这些行没有任何效果:

 - cal.setTimeZone(TimeZone.getTimeZone(cal.getTimeZone().getDisplayName()));
 - cal.setTimeZone(TimeZone.getTimeZone("EST"));
 - cal.setTimeZone(TimeZone.getTimeZone("UTC"));
 - cal.setTimeZone(TimeZone.getTimeZone("GMT"));
 - cal.setTimeZone(TimeZone.getTimeZone("GMT-5:00"));
PrintWriter output = null;

try {
  output = new PrintWriter(
   new BufferedWriter(new FileWriter("output.txt", true)));

  DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:ms MM/dd/yyyy");
  Calendar cal = Calendar.getInstance();

  // ...doesn't seem to be working:
  cal.setTimeZone(TimeZone.getTimeZone(cal.getTimeZone().getDisplayName()));

  /*
   * adding an extra hour here, to make up for the incorrect hour value???
   * ...without this line, everything is correct except the hour = n - 1:
   */
  //cal.setTimeInMillis(cal.getTimeInMillis() + (1000 * 60 * 60));

  // printing to console here:
  System.out.println(dateFormat.format(cal.getTime()));
  System.out.println(cal.getTimeZone().getDisplayName());

  // printing to the log-file here:
  output.println(dateFormat.format(cal.getTime()));
  output.println(cal.getTimeZone().getDisplayName());

} catch (IOException e) {
  e.printStackTrace();

} finally {
  if (output != null) {
    output.close();
  }
}


输出:

10:05:43:543 10/10/2013
GMT-05:00

错误--应该是11:05:43:543!(附注--很遗憾我不能使用Joda-Time)

共有1个答案

容俊豪
2023-03-14

1)在SimpleDateFormat中设置时区

2)要么使用UTC,要么使用“真实”时区(如“奥地利/维也纳”);
(国家名称,以及时区中最大的城市,请查找以确定)
EST(=UTC-5)不是非常适合计算目的的时区,因为它是没有夏令时的时间。

再举一个中欧的例子:
冬天我们使用MEZ(CET),夏天(夏令时)我们使用(MESZ=CEST)。
但您希望您的计算机为您计算该值,所以不要使用该值:

时区是地理位置上的,因此需要国家的名称。
每个国家都可以决定在他们想改变时区的时候改变他们的时区(例如前一段时间俄罗斯,现在西班牙正在讨论)

 类似资料:
  • 所以我当前处于“America/Los_Angeles”时区(PDT)中,但是当我创建一个新的moment对象并通过moment tz将其时区设置为我所在的时区('America/Los_Angeles'),如下所示: 错误的时间被返回。具体来说就是提前8个小时。所有其他时区也会出现这种情况。 我是不是从根本上误解了这是怎么工作的? 谢谢你的帮助!

  • 问题内容: 执行以上代码段后,month的值为10而不是11。 问题答案: 月份从0而不是1索引,因此10是11月,而11是12月。

  • 我有以下应该返回时间戳的函数。当使用以下斜杠以字符串格式输入日期时,此代码有效:“2019/3/4”,但在使用 怎么回事?

  • 问题内容: 我在将json文件中的日期转换为时间戳时遇到问题。当小时= 12时,返回的时间戳不正确。 Java版本1.8.0_171 使用下面的代码片段,我希望输出为 2017-07-19 07:43:42.0 2017-07-18 08:43:42.0 2017-07-19 09:43:42.0 相反,我得到 2017-07-19 07:43:42.0 2017-07-18 20:43:42.0

  • 我有一个验证方法,将两个输入作为开始日期和结束日期,并检查结束日期是否有效,即在开始日期之后。我使用Calendar方法获取两个日期的毫秒数并得到差值。如果差值为负值,则其无效的结束日期,即结束日期早于开始日期。结束日期的毫秒值应始终大于开始日期。但在某些情况下,在开始日期的情况下,getTimeInMillis()会提供更大的值。 这是我的代码: 输出为: 这里2015-01-31是开始日期,2

  • 问题内容: 根据doc,日历set()为: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html#set%28int,%20int,%20int%29 码: 输出: 为什么不是1月30日??? 问题答案: 1月是2月。2月30日更改为3月1日。您应该将月份设置为0。最好是使用Calendar中定义的常量: