作者:手机用户2602916235 | 来源:互联网 | 2023-05-17 11:45
还是在工作中遇到的问题,一般是在UI上提供日期Widget,让用户去选日期,一般的逻辑是DateFormatter的short日期模式。然而在UI上,有些locale的格式(比如Polish)是Med
还是在工作中遇到的问题,一般是在UI上提供日期Widget,让用户去选日期,一般的逻辑是DateFormatter的short日期模式。然而在UI上,有些locale的格式(比如Polish)是Medium格式:yyyy/mm/dd,但是Polish locale的Short日期模式是dd/mm/yy。
对java.text.DateFormat.parse(String source, ParsePosition pos)而言,默认的解析是宽大的:即使用户输入的日期不是以对象要求的格式输入,也能够解析为日期,然后解析会成功。
但是对于特殊的locale,比如Polish,鉴于format不一致(yyyy/mm/dd vs dd/mm/yy),一个Medium模式的字符串不能使用Dateformat对象的Short日期模式去解析,如果试图去解析的话,会抛出异常。
解决方法:当使用Short模式解析不成功的话,使用Medium模式去解析。
package tools;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
public class MedeiumAndShortDateFormalForAllLocale {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List allLocale = new ArrayList();
System.out.println(System.getProperty("java.version"));
Locale[] locales = Locale.getAvailableLocales();
allLocale = Arrays.asList(locales);
Date date = new Date();
DateFormat df = null;
String strDate = DateFormat.getDateInstance(DateFormat.SHORT).format(date);
System.out.println(strDate);
for(Locale locale : allLocale){
if(locale != null){
df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
}
try {
date = df.parse(strDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
System.out.println("Error in parsing locale with Short: " + locale
+ "==>"
+ locale.getDisplayCountry());
df = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
try {
date = df.parse(strDate);
} catch (ParseException e1) {
// TODO Auto-generated catch block
System.out.println("Error in parsing locale with Medium: " + locale
+ "==>"
+ locale.getDisplayCountry());
e1.printStackTrace();
}
e.printStackTrace();
}
// DateFormat mediumFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
System.out.println("Medium Fromat for Today: "
+ locale
+ "=>"
+ locale.getCountry()
+ "=>"
+ locale.getDisplayCountry()
+ "=>"
+ df.format(date));
}
}
}