2013-03-17 45 views
0

我的格式为年月日,我试图解析为使用作为为什么从String转换日期时Java时区不同?

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 >>日期被格式化后:星期六3月31日1点00分〇〇秒BST 2012
  • 20121231 >> GMT >>日期被格式化后:周一12月31日00:00:00 GMT 2012
  • 20130328 >> GMT >>日期被格式化后:周四3月28日00:00:00 GMT 2013
  • 20130331 >> GMT >>格式化后的日期:Sun M ar 31 00:00:00 GMT 2013
  • 20140331 >> BST >>格式化后的日期:星期一3月31日01:00:00 BST 2014
  • 20130401 >> BST >>格式化后的日期:星期一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年,所有计算到格林威治标准时间。我不知道为什么会发生这种情况。

问题是,我在这些日期中添加了结束时间...... 我使用从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(); 
} 

但在其转换为GMT如果我要添加23时59分59秒......这不是设置的日期原始日期的结束,而是采用BST之间的时间差异列表的情况下和GMT考虑

  • 太阳03月31日00:00:00 GMT 2013成为周一4月1日零点59分59秒BST 2013(次日+ 1小时) 而
  • 周一4月1日01:00: 00 BST 2013变成Mon Apr 01 23:59:59 BST 2013(今天结束是我想要的)

有人可以请说明为什么这似乎是hapening。相同的代码是用不同的YYYMMDD格式输入运行的?

+1

我不明白。您将默认时区设置为BST,然后打印日期,并且在BST时区输出日期会感到惊讶吗?这不是预期的吗?或者我错过了什么?你可以发布SSCCE,告诉我们你期望它做什么以及它做什么? – 2013-03-17 10:26:47

回答

5

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

夏天,伦敦在英国夏令时(BST)时区。在冬天,它在格林威治标准时区。而这个时区变化的日子每年都不一样。

+0

谢谢JB ......这很有道理。我来自南非,时间总是一样的。更有意义。 :) – Chrispie 2013-03-17 11:35:50

+1

@Chrispie是的,夏令时是真正的群体疯狂。一个巨大的混乱和昂贵的努力没有任何证明的好处。通常,在信息处理中最好用UTC来处理和存储数据时间值(无时区偏移量)。然后转换为时间分区值,仅用于呈现给用户。 – 2014-04-08 14:01:07

2

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

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

相关问题