2015-09-29 84 views
6

我需要將不完整日期的格式設置爲月份精度。我的第一個猜測是將模式「MMMM yyyy」應用於它。這適用於許多語言環境(英語,德語,...),但對於具有彎曲的語言會產生醜陋的結果。俄語。我讀documentation of SimpleDateFormat,發現'L'應該給上下文不敏感的月份名稱:正是我所需要的,因爲該模式中沒有一個月的某一天。所以我嘗試了模式「LLLL y​​yyy」。它適用於俄羅斯和其他彎曲語言,但相反,英語和德語...Java日期格式的月份名稱的獨立形式

下面是測試代碼:

import java.text.*; 
import java.util.*; 

public class test 
{ 
    public static void main (String[] arguments) throws Exception 
    { 
     for (String locale : new String[] { "en", "de", "hu", "it", "ru", "fi", "pl" }) 
      System.out.format ("%s: %s \t%s\n", locale, 
           new SimpleDateFormat ("MMMM yyyy", new Locale (locale)).format (new Date()), 
           new SimpleDateFormat ("LLLL yyyy", new Locale (locale)).format (new Date())); 
    } 
} 

,其輸出:

en: September 2015  0009 2015 
de: September 2015  0009 2015 
hu: szeptember 2015  szeptember 2015 
it: settembre 2015  Settembre 2015 
ru: сентября 2015  Сентябрь 2015 
fi: syyskuuta 2015  syyskuu 2015 
pl: września 2015  wrzesień 2015 

因此,對於測試區域設置: '恩' 和 '德' 正常工作只有'M','hu'對於'M'和'L'都是可以的,''它可能更好地用'L'(不知道大寫字母在這裏有多重要),而'ru' 'fi'和'pl'只給出'L'的正確輸出(我只能說俄語和波蘭語,但我認爲它與芬蘭語相似)。

問題:

  • 我能做些什麼,使SimpleDateFormat或類似的日期格式類治療「L」正確的所有語言環境?

  • 或者,有沒有一種簡單的方法來判斷'M'或'L'是否應該用於任何給定的語言環境?

+0

我不會說俄語,但你是說'M'標識符給出了不正確的月份名稱? 'сентября'和'Сентябрь'之間的意義有什麼不同? – Tunaki

+1

和芬蘭一樣。這個月的名字是syyskuu。但是,如果有一天提到它必須是:15. syyskuuta(這是獨立形式與上下文敏感的意思)。 –

+1

您正在使用哪個版本的Java 8? 'L'只在Java 8中引入,在我的機器上,程序爲'en'和'de'生成「September」。也許你有一個過時的語言環境文件的版本? – RealSkeptic

回答

3

這是一個官方的bug - JDK-8075548

的錯誤是在狀態「已解決」,你可以看到,修復已被移植到版本8_60和8_65,而不是更早版本的Java 8

因此,如果可能的話,正確的解決方案是升級到Java 1.8.0_60。

+0

是的,按照預期與升級60一起工作。謝謝。 – doublep

0

java.time

SimpleDateFormat類是現在遺留的麻煩舊日期時間類,由java.time類取代的一部分。

在java.time中,格式化模式代碼與舊模式代碼類似,但接下來完全相同。請務必學習DateTimeFormatter的課程文檔。

final DateTimeFormatter fCombo = DateTimeFormatter.ofPattern ("MMMM uuuu"); 
final DateTimeFormatter fStandalone = DateTimeFormatter.ofPattern ("LLLL uuuu"); 

final LocalDate localDate = LocalDate.now (ZoneId.of ("America/Montreal")); 
for (final String locale : new String[] { "en" , "fr" , "de" , "hu" , "it" , "ru" , "fi" , "pl" }) { 
    final Locale l = new Locale (locale); 

    System.out.format (
      "%s: %s | %s\n", 
      locale, 
      localDate.format (fCombo.withLocale (l)), 
      localDate.format (fStandalone.withLocale (l)) 
    ); 
} 
EN

:2017年三月| 3 2017年

FR:火星2017年| 3 2017年

:2017年馬茲| 3 2017年

於:2017年三月| 2017年3月

吧:2017年馬索|馬索2017年

汝:2017年марта| Март2017年

網絡連接:maaliskuuta 2017年| maaliskuu 2017年

如馬卡報2017年| Marzec 2017年


關於java.time java.time該框架是建立在Java 8和更高版本。這些類取代舊的麻煩legacy日期時類java.util.Date比如,Calendar,& SimpleDateFormat

Joda-Time的項目,現在在maintenance modejava.time建議遷移到的類。

要了解更多信息,請參見Oracle Tutorial。堆棧溢出,並尋找例子,很多解釋。規格爲JSR 310

在何處獲得java.time類?

ThreeTen-Extra該項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如IntervalYearWeekYearQuartermore

相關問題