解析复杂的日期格式

时间:2014-09-25 14:12:25

标签: java date

我是java编程的初学者。

我想解析一个复杂的日期格式:YYYY-MM-DDthh:mm:ssTZD,例如2014-09-24T21:32:39-04:00

我试过了:

String str_date="2014-09-24T21:32:39-04:00";
DateFormat formatter = new SimpleDateFormat("YYYY-MM-DDthh:mm:ss");
Date date = (Date)formatter.parse(str_date);

但对于时区部分(-04:00),我不知道放什么(after the :ss)

任何帮助?

3 个答案:

答案 0 :(得分:2)

<强> Java7

SimpleDateFormat文档将时区列为zZX,对您而言,您似乎需要XXX

<强>的Java6

Java7添加了X说明符,但仍有6个Zz。但是,您必须先修改字符串,以便它在时区中没有冒号或在GMT之前有-

String str_date="2014-09-24T21:32:39-04:00";
int index = str_date.lastIndexOf( '-' );

str_date = str_date.substring( 0, index ) + "GMT" + str_date.substring( index+1 );

然后您可以使用格式说明符z

答案 1 :(得分:2)

如果您使用的是Java < 7,那么您需要从输入中删除':'并解析它:

以下是一个例子:

public static void main(String[] args) throws ParseException {
        String str_date="2014-09-24T21:32:39-04:00";
        str_date = str_date.replaceAll(":(\\d\\d)$", "$1");
        System.out.println("Input modified according to Java 6: "+str_date);
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
        Date date = (Date)formatter.parse(str_date);
        System.out.println(date);
    }

打印:

Input modified according to Java 6: 2014-09-24T21:32:39-0400
Wed Sep 24 21:32:39 EDT 2014

答案 2 :(得分:0)

ISO 8601

您的字符串符合ISO 8601标准。该标准用作两个出色的日期时间库解析和生成字符串的默认值:

  • Joda-Time
  • java.time包(与Java 8捆绑在一起,受Joda-Time启发,由JSR 310定义)

仅将您的字符串传递给构造函数或工厂方法。内置格式化程序会自动用于解析字符串。

与java.util.Date不同,在这两个库中,日期时间对象知道自己分配的时区。在字符串末尾指定的UTC偏移量用于计算自UTC时区1970年初的Unix纪元以来的毫秒数(或java.time中的纳秒数)。在计算之后,为结果日期时间分配您选择的时区。在这个例子中,我任意指定一个印度时区。为清楚起见,此示例以UTC格式创建第二个日期时间对象。

约达时间

DateTimeZone timeZoneIndia = DateTimeZone.forID( "Asia/Kolkata" ); 
DateTime dateTimeIndia = new DateTime( "2014-09-24T21:32:39-04:00" , timeZoneIndia );
DateTime dateTimeUtc = dateTimeIndia.withZone( DateTimeZone.UTC );