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");
}
如何测试格式是否有效,我将在另一种方法中格式化日期,所以在这个方法中我想解析格式
答案 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'
。
如果要包含自定义字符或字符串,则必须将它们用单引号括起来。除非你把这些字符包含在单引号中,否则它将是一种非法的日期格式,因此不受支持并导致异常。
中建议的示例+----+--------------------------------+--------------------------------------+
| # | 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中观察到相同的规则。