简单的日期格式为两个不同的字符串提供相同的日期

时间:2011-07-21 23:56:09

标签: android simpledateformat

我写了一个小方法,在给定字符串时返回日期对象。方法如下所示:

public Date getDateObjectFromString(String dateAsString)
{
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    Date tempDate = null;

    try
    {
        tempDate = sdf.parse(dateAsString);
    }
    catch(ParseException pe)
    {
        //do some error reporting here
    }
    return tempDate;
}

一切正常,但我遇到了一些我想澄清的事情。当我将两个不同的字符串传递给此方法时,它在读取调试器中的值时返回相同的日期。我传递的两个字符串是:

2011-07-21T19:44:00.000-0400

2011-07-21T19:44:00.000-04:00

正如您所看到的,这两个字符串几乎相同,当我在调试器中查看这些新创建日期的变量输出时,它会显示两个字符串完全相同的日期/时间。那么,如果调试器显示相同的日期,第二个字符串中的冒号(04:00)是否有任何区别?我应该担心还是可以在没有出现任何奇怪错误的情况下继续进行?

3 个答案:

答案 0 :(得分:1)

这就是维基百科关于ISO 8601 'Time offsets from UTC'

的说法
  

UTC的偏移量以±[hh]:[mm],±[hh] [mm]或±[hh]的格式给出。

所以基本上你使用的两种格式都是允许的,你不应该担心它。

答案 1 :(得分:0)

第二根弦中的冒号没有区别;你可以毫无畏惧地继续前进。

答案 2 :(得分:0)

SimpleDateFormat的Android文档提到他们使用RFC 822时区。当我使用SimpleDateFormat的JavaDocs时,这是Android试图模仿这个类,我看到this note关于RFC 822时区:

  

RFC 822时区:用于格式化,RFC 822 4位时区   使用格式:

 RFC822TimeZone:
         Sign TwoDigitHours Minutes
 TwoDigitHours:
         Digit Digit
     

TwoDigitHours必须介于00和23之间。其他定义如下   一般时区。对于解析,一般时区也是   接受

以下是一般时区的说明

  

常规时区:时区被解释为文本(如果有)   名。对于表示GMT偏移值的时区,以下内容   使用语法:

 GMTOffsetTimeZone:
         GMT Sign Hours : Minutes
 Sign: one of          ^^^
         + -
 Hours:
         Digit
         Digit Digit
 Minutes:
         Digit Digit
 Digit: one of
         0 1 2 3 4 5 6 7 8 9
     

小时数必须介于0到23之间,分钟数必须介于00和59之间。   格式与区域设置无关,数字必须取自   Unicode标准的基本拉丁语块。

在一般时区的定义中,您会注意到它们使用':'。

这意味着你的两个字符串虽然不同,但会被同时解析。

  1. RFC 822 - > 2011-07-21T19:44:00.000-0400
  2. 一般 - > 2011-07-21T19:44:00.000-04:00