0

我有格式为 YYYYMMDD 的日期字符串,我试图使用获取的日期格式化程序将其解析为日期

public static DateFormat getDateFormat() {
  SimpleDateFormat result = new SimpleDateFormat("yyyyMMdd");                  
  result.setLenient(false);
  return result;
}

我将程序运行时的默认时区设置为

public static void doTheDateZoneInit() {
    TimeZone tzone = TimeZone.getTimeZone("Europe/London");
    TimeZone.setDefault(tzone);
}

当我格式化日期并输出它而不在打印字符串中指定时区时

Date myDate= getDateFormat().parse("20110331");
System.out.println("Date after it is formatted:" + myDate);

输出在 BST 时区

Date after it is formatted:Thu Mar 31 01:00:00 BST 2011

如果我在不同的日期一遍又一遍地运行相同的东西,我会得到不同的输出

  • 20120331 >> BST >> 格式化后的日期:Sat Mar 31 01:00:00 BST 2012
  • 20121231 >> GMT >> 格式化后的日期:Mon Dec 31 00:00:00 GMT 2012
  • 20130328 >> GMT >> 格式化后的日期:Thu Mar 28 00:00:00 GMT 2013
  • 20130331 >> GMT >> 格式化后的日期:Sun Mar 31 00:00:00 GMT 2013
  • 20140331 >> BST >> 格式化后的日期:Mon Mar 31 01:00:00 BST 2014
  • 20130401 >> BST >> 格式化后的日期:Mon Apr 01 01:00:00 BST 2013
  • 20130402 >> BST >> 格式化后的日期:Tue Apr 02 01:00:00 BST 2013
  • 20130501 >> BST >> 格式化后的日期:Wed May 01 01:00:00 BST 2013

似乎在 2012 年到 2013 年有一个范围,所有计算都以 GMT 为准。我不知道为什么会这样。

问题是我在这些日期中添加了结束时间......例如,我使用从 String 转换的日期调用以下方法并将 23:59:59:999 添加到它以获得最新的指定日期的时间。

public static Date addAlmostOneDay(Date startDate) {
    Calendar cal = new GregorianCalendar();
    cal.setTime(startDate);
    cal.add(Calendar.HOUR, 23);
    cal.add(Calendar.MINUTE, 59);
    cal.add(Calendar.SECOND, 59);
    cal.add(Calendar.MILLISECOND, 999);
    return cal.getTime();
}

但是,如果我要添加 23:59:59,它会转换为 GMT ......它不会将日期设置为原始日期的末尾,而是将 BST 和 GMT 之间的时间差异考虑在内

  • Sun Mar 31 00:00:00 GMT 2013 变为 Mon Apr 01 00:59:59 BST 2013(次日 + 1 小时),而
  • Mon Apr 01 01:00:00 BST 2013 变成 Mon Apr 01 23:59:59 BST 2013 (今天结束就是我想要的)

有人可以解释一下为什么这似乎正在发生。使用 YYYMMDD 格式的不同输入运行相同的代码?

4

2 回答 2

5

好的,我想我明白你的意思了。您将默认时区设置为伦敦之一。

在夏季,伦敦处于英国夏令时 (BST) 时区。在冬季,它位于 GMT 时区。并且此时区更改完成的日期每年都不同。

于 2013-03-17T10:46:36.093 回答
2

BST 是英国夏令时,伦敦的有效时区在 2013 年 3 月 31 日至 2013 年 10 月 27 日和 2014 年 3 月 30 日至 2014 年 10 月 26 日之间。

在这些日期之间,选择欧洲/伦敦作为时区将为您提供 BST,在冬季,伦敦的正确时区是 GMT,这与您的输出一致。

于 2013-03-17T10:47:04.723 回答