2015-08-12 2 views
0

EEE MMM dd HH:mm:ss t yyyyКак разобрать DateFormat в SimpleDateFormat

В процессе анализа этого формата, я имел

 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"); 
    } 

Как проверить, если формат действительно, я буду форматировать дату в другом методе, так в этом методе я хотел бы проанализировать формат

+0

Вы никогда не сможете проанализировать дату с первым форматом, так как шаблон недействителен. Нет описания 't' в шаблоне – Jens

ответ

2

Вы можете попробовать его таким образом. Если ваша дата String не может проанализировать данный формат, будет throw a 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 там тоже.

Вы можете найти все о дате formatters от here.

+0

' new SimpleDateFormat (format) .' выдает 'IllegalArgumentException', потому что шаблон неправильный. Не 'ParseException' – Jens

+0

@Jens да. Я отредактировал свой ответ, чтобы упомянуть об этом. –

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 с форматом по умолчанию.

1

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' как часть отформатированных дат, вы должны включить его Int формат строки в одинарных кавычках.

То же правило применяется для всех таких пользовательских символов или строк, как 'at' HH 'hours' и т.д. Вы можете наблюдать то же самое в примерах 1, 2, 4, 9, 10 и 11 выше.

Смежные вопросы