如何在SimpleDateFormat中解析dateformat

时间:2015-08-12 06:42:08

标签: java

EEE MMM dd HH:mm:ss t yyyy

在解析此日期格式时,我有

        java.lang.IllegalArgumentException: Illegal pattern character 't'
        at java.text.SimpleDateFormat.compile(SimpleDateFormat.java:845)
        at java.text.SimpleDateFormat.initialize(SimpleDateFormat.java:659)
        at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:585)
        at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:560)
        at centina.sa.client.session.User.getUserDateTimeFormat(User.java:290)
        at centina.sa.client.session.User.getUserDateTimeFormatPattern(User.java:284)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.jboss.seam.util.Reflections.invoke(Reflections.java:22)
        at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:32)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56)
        at org.jboss.seam.transaction.RollbackInterceptor.aroundInvoke(RollbackInterceptor.java:28)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
        at org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:77)

为了避免这种情况,我想解析之前的格式,如果它有效我想使用相同的格式 或者一些defualt模式

 public SimpleDateFormat testFormat( )
    {
    String format = "EEE MMM dd HH:mm:ss t yyyy";
     String default_format = "EEE MMM dd HH:mm:ss z yyyy";
    if(format is valid)
    {
     return format;
    }
    else
    {
     return default_format;
    }
    }

    SimpleDateFormat DATE_FORMAT = testFormat();
    public void testDate(DATE_FORMAT)
    {
     String date = DATE_FORMAT.format("some date");
    }

如何测试格式是否有效,我将在另一种方法中格式化日期,所以在这个方法中我想解析格式

3 个答案:

答案 0 :(得分:2)

你可以这样试试。如果您的日期String无法使用给定格式解析throw ParseException,请抓住ParseException并尝试使用其他格式。

String format = "EEE MMM dd HH:mm:ss t yyyy";  
String default_format = "EEE MMM dd HH:mm:ss z yyyy";
Date date=null;
try{
 date=new SimpleDateFormat(format).parse("some day"); 
}catch (ParseException|IllegalArgumentException e){
  try {
   date=new SimpleDateFormat(default_format).parse("some day");
  } catch (ParseException|IllegalArgumentException e1) {
        // Invalid date format 
  }     
}

但是你应该使用正确的日期格式,否则你会得到IllegalArgumentException,因为模式是错误的。

您也可以验证日期格式。只是在那里抓住IllegalArgumentException

您可以在here找到所有关于日期格式化程序的信息。

答案 1 :(得分:1)

创建SimpleDateFormat对象时,只需捕获IllegalArgumentException: -

 private SimpleDateFormat getValidDateFormatObject(String format){
    final String DEFAULT_FORMAT = "EEE MMM dd HH:mm:ss z yyyy";
    SimpleDateFormat sdf=null;
    try{
        sdf = new SimpleDateFormat(format);
    }
    catch( IllegalArgumentException excep){
        sdf = new SimpleDateFormat(DEFAULT_FORMAT);
    }
    return sdf;
}

此方法将返回一个有效的DateFormat对象,如果格式不正确,它将返回默认格式的DateFormat对象。

答案 2 :(得分:1)

使用的第一个模式'EEE MMM dd HH:mm:ss t yyyy'格式无效 它可以是'EEE MMM dd HH:mm:ss 't' yyyy'

如果要包含自定义字符或字符串,则必须将它们用单引号括起来。除非你把这些字符包含在单引号中,否则它将是一种非法的日期格式,因此不受支持并导致异常。

SimpelDateFormat文档

中建议的示例
+----+--------------------------------+--------------------------------------+
|  # | Date and Time Pattern          | Result                               |
+----+--------------------------------+--------------------------------------+
|  1 | "yyyy.MM.dd G 'at' HH:mm:ss z" | 2001.07.04 AD at 12:08:56 PDT        |
|  2 | "EEE, MMM d, ''yy"             | Wed, Jul 4, '01                      |
|  3 | "h:mm a"                       | 12:08 PM                             |
|  4 | "hh 'o''clock' a, zzzz"        | 12 o'clock PM, Pacific Daylight Time |
|  5 | "K:mm a, z"                    | 0:08 PM, PDT                         |
|  6 | "yyyyy.MMMMM.dd GGG hh:mm aaa" | 02001.July.04 AD 12:08 PM            |
|  7 | "EEE, d MMM yyyy HH:mm:ss Z"   | Wed, 4 Jul 2001 12:08:56 -0700       |
|  8 | "yyMMddHHmmssZ"                | 010704120856-0700                    |
|  9 | "yyyy-MM-dd'T'HH:mm:ss.SSSZ"   | 2001-07-04T12:08:56.235-0700         |
| 10 | "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" | 2001-07-04T12:08:56.235-07:00        |
| 11 | "YYYY-'W'ww-u"                 | 2001-W27-3                           |
+----+--------------------------------+--------------------------------------+

示例说明如果您希望't'作为格式化日期的一部分,则必须将其包含在单引号内的格式字符串中。

同样的规则适用于所有此类自定义字符或字符串,例如'at' HH 'hours'等。您可以在上面的示例1,2,4,9,10和11中观察到相同的规则。