簡體   English   中英

無法解釋的希臘日期 - SimpleDateFormat

[英]Unparseable Greek date - SimpleDateFormat

我正在嘗試使用SimpleDateFormat讀取表示希臘語日期時間的字符串(如“28Μαρτίου2014,14:00”),但它會拋出java.text.ParseException: Unparseable date: "28 Μαρτίου 2014, 14:00"錯誤。

這是一個示例代碼:

Locale locale = new Locale("el-GR");
SimpleDateFormat formatter = new SimpleDateFormat("dd MMMM yyyy, HH:mm", locale);
try {
     sDate = (Date) formatter.parse("28 Μαρτίου 2014, 14:00");
 } catch (ParseException ex) {
     ex.printStackTrace();
 }

我也試過locales el和el_GR,但沒有運氣。

有什么建議么?

a)首先要說的是,永遠不要使用表達式new Locale("el-GR") ,而是使用new Locale("el", "GR")或沒有國家/地區new Locale("el") ,請參閱javadoc以正確使用構造函數(因為沒有語言代碼“el-GR”)。

b)您觀察到的異常(以及我,但不是每個人)都是由底層JVM的不同本地化資源引起的。 我的JVM證明(1.6.0_31):

Locale locale = new Locale("el");
DateFormatSymbols dfs = DateFormatSymbols.getInstance(locale);
for (String m : dfs.getMonths()) {
    System.out.println(m);
}

// output
Μάρτιος
Απρίλιος
Μάϊος
Ιούνιος
Ιούλιος
Αύγουστος
Σεπτέμβριος
Οκτώβριος
Νοέμβριος
Δεκέμβριος

可以在CLDR-repository中找到有關不同數據的說明,以獲取本地化資源。 現代希臘語知道3月份的至少兩種不同形式(Μαρτίουvs獨立形式Μάρτιος)。 Java-version 6使用獨立形式,而Java-version 7使用普通形式。

另請參閱java-version 8的兼容性說明 ,其中您可以選擇指定格式模式(獨立或不單獨):

使用DateFormat和SimpleDateFormat格式化日期時間值時,對於具有月份名稱的格式和獨立形式的語言,支持上下文敏感的月份名稱。 例如,捷克語中1月的首選月份名稱是格式化表單中的ledna,而它是以獨立形式加載的。 DateFormatSymbols的getMonthNames和getShortMonthNames方法以這些語言的格式化形式返回月份名稱。 請注意,DateFormatSymbols返回的月份名稱是獨立形式,直到Java SE 7 您可以使用Calendar.getDisplayName和Calendar.getDisplayNames方法指定格式和/或獨立表單...

所以顯而易見的解決方案是更新到Java 7 外部圖書館在這里沒有幫助,因為今天沒有一個人擁有自己的希臘資源。 但是,如果您因任何原因被迫繼續使用Java 6,那么遵循笨拙的解決方法將有助於:

Locale locale = new Locale("el", "GR");
SimpleDateFormat formatter = new SimpleDateFormat("dd MMMM yyyy, HH:mm", locale);
DateFormatSymbols dfs = DateFormatSymbols.getInstance(locale);
String[] months = {"Ιανουαρίου", "Φεβρουαρίου", "Μαρτίου", "Απριλίου", "Μαΐου", "Ιουνίου", "Ιουλίου", "Αυγούστου", "Σεπτεμβρίου", "Οκτωβρίου", "Νοεμβρίου", "Δεκεμβρίου"};
dfs.setMonths(months);
formatter.setDateFormatSymbols(dfs);

try {
     System.out.println(formatter.parse("28 Μαρτίου 2014, 14:00"));
     // output in my timezone: Fri Mar 28 14:00:00 CET 2014
} catch (ParseException ex) {
     ex.printStackTrace();
}

以下代碼對我有用。 仔細檢查使用的字符。 你的問題也是一個拼寫錯誤的角色

public static void main(String [] args) {
    Locale locale = new Locale("el", "GR");
    SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy, HH:mm", locale);
    try {
        System.out.println(formatter.parse("28 Ιανουάριος 2014, 14:00"));
        System.out.println(formatter.parse("28 Φεβρουάριος 2014, 14:00"));
        System.out.println(formatter.parse("28 Μάρτιος 2014, 14:00"));
        System.out.println(formatter.parse("28 Απρίλιος 2014, 14:00"));
        System.out.println(formatter.parse("28 Μάϊος 2014, 14:00"));
        System.out.println(formatter.parse("28 Ιούνιος 2014, 14:00"));
        System.out.println(formatter.parse("28 Ιούλιος 2014, 14:00"));
        System.out.println(formatter.parse("28 Αύγουστος 2014, 14:00"));
        System.out.println(formatter.parse("28 Σεπτέμβριος 2014, 14:00"));
        System.out.println(formatter.parse("28 Οκτώβριος 2014, 14:00"));
        System.out.println(formatter.parse("28 Νοέμβριος 2014, 14:00"));
        System.out.println(formatter.parse("28 Δεκέμβριος 2014, 14:00"));

     } catch (ParseException ex) {
         ex.printStackTrace();
     }
}

輸出:

Tue Jan 28 14:00:00 IST 2014
Fri Feb 28 14:00:00 IST 2014
Fri Mar 28 14:00:00 IST 2014
Mon Apr 28 14:00:00 IST 2014
Wed May 28 14:00:00 IST 2014
Sat Jun 28 14:00:00 IST 2014
Mon Jul 28 14:00:00 IST 2014
Thu Aug 28 14:00:00 IST 2014
Sun Sep 28 14:00:00 IST 2014
Tue Oct 28 14:00:00 IST 2014
Fri Nov 28 14:00:00 IST 2014
Sun Dec 28 14:00:00 IST 2014

這項工作對我來說:

Locale locale = new Locale("el", "GR");
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy, HH:mm", locale);
try {
       Date sDate = formatter.parse("28 Μαρτίου 2014, 14:00");
       System.out.println(sDate);
} catch (ParseException ex) { ex.printStackTrace();}

在此博客中,您可以獲得更多信息

https://grooovygeorge.wordpress.com/2012/03/15/why-simpledateformatter-isnt-really-simple-with-locales/

String target = "28 Μαρτίου 2014, 14:00";
    Locale locale = new Locale("el", "GR");
    try
    {
        DateFormat df = new SimpleDateFormat("dd MMM yyyy, HH:mm", locale);
        Date result =  df.parse(target);
        System.out.println(result);
    }
    catch(ParseException e)
    {
        e.printStackTrace();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM