解析特殊locale的日期格式

还是在工作中遇到的问题,一般是在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<Locale> allLocale = new ArrayList<Locale>();
        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)); 
        }
    }
}

 

posted @ 2013-03-13 15:17  小楼  阅读(2324)  评论(0编辑  收藏  举报