2014-02-09 81 views
4

即時通訊使用Joda Time格式化日期時間如下:如何獲取區域設置日期格式的月份和日子

DateTimeFormatter dateFormatter = DateTimeFormat.longDate(); 
String startTimeStr = dateFormatter.print(localStartTime); 

變量的值是:

localStartTime={[email protected]}"2013-04-06T23:54:35.000" 
startTimeStr={[email protected]}"2013年4月6日" 

問題是我怎麼能獲得月份和日期的區域日期格式?我曾嘗試以下代碼:

DateTimeFormatter monDayFormatter = DateTimeFormat.forPattern("MMMd"); 
String startTimeStr = monDayFormatter.print(localStartTime); 

和變量的值是:

localStartTime={[email protected]}"2013-04-06T23:54:35.000" 
startTimeStr={[email protected]}"4月6" 

我預計startTimeStr4月6日。這裏的漢字 = Day。 我不想將模式硬編碼到「MMMd日」,因爲它應該根據當前的語言環境信息進行自我調整。任何幫助將不勝感激。

回答

5

在Unicode協會的網站,你會在中國CLDR repository找到例如條目喜歡如下(日曆類型=公曆):無論是在JodaTime或JDK的日期格式類

<dateFormats> 
    <dateFormatLength type="full"> 
    <dateFormat> 
    <pattern>y年M月d日EEEE</pattern> 
    </dateFormat> 
    </dateFormatLength> 
    <dateFormatLength type="long"> 
    <dateFormat> 
     <pattern>y年M月d日</pattern> 
    </dateFormat> 
    </dateFormatLength> 
    <dateFormatLength type="medium"> 
    <dateFormat> 
     <pattern>y年M月d日</pattern> 
    </dateFormat> 
    </dateFormatLength> 
    <dateFormatLength type="short"> 
    <dateFormat> 
     <pattern>yy/M/d</pattern> 
    </dateFormat> 
    </dateFormatLength> 
</dateFormats> 

內部每一個本地化的日期格式被翻譯成這樣的模式 - 包括像「日」這樣的文字。 CLDR沒有定義月,日,僅格式,但是這僅僅是一個普通年 - 月 - 日 - 格式的一部分,所以如果你作爲替代使用

DateTimeFormatter dateFormatter = DateTimeFormat.longDate().withLocale(Locale.CHINESE); 
LocalDateTime localStartTime = new LocalDateTime(2013,4,6,23,54,35); 
String startTimeStr = dateFormatter.print(localStartTime); 
System.out.println(startTimeStr); // output: 2013年4月6日 

驗證碼:

DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("M月d日"); 
LocalDateTime localStartTime = new LocalDateTime(2013,4,6,23,54,35); 
String startTimeStr = dateFormatter.print(localStartTime); 
System.out.println(startTimeStr); // output: 4月6日 

然後你得到你想要的。雖然你寫:

我不想硬代碼幾乎是相同的程序,在內部圖書館完成的模式爲「MMMd日」

。所以模式本身通過選擇適當的文字來進行本地化。沒有辦法從CLDR中提取沒有年份的本地化日期模式。如果你想這樣做,那麼你必須管理你自己的一套本地化的月日模式,適用於不同的地區,可能在地圖<區域設置,字符串>。

更新從2016年12月6日:

沒有一個通用的任何語言環境的月,日模式的情況並沒有改變對喬達時間。不幸的是,Joda-Time的官方繼任者JSR-310(java.time -package)也不能很好地管理它,請參閱JDK-issue 8168532。這足以讓我爲自己的時間庫Time4J找到解決方案。對CLDR數據的仔細分析表明,其他日期格式可用於多種語言,但在不同的部分和accessible via a group of fields。密鑰「Md」,「MMMd」和「MMMMd」與您的用例相關。例如在Time4J(其中應該有希望通過JSR-310的支持,同樣,在以後的版本):

PlainTimestamp tsp = Iso8601Format.EXTENDED_DATE_TIME.parse("2013-04-06T23:54:35.000"); 
    AnnualDate ad = AnnualDate.of(tsp.getMonth(), tsp.getDayOfMonth()); 
    ChronoFormatter<AnnualDate> chinese = 
     ChronoFormatter.ofStyle(DisplayMode.LONG, Locale.CHINESE, AnnualDate.chronology()); 
    ChronoFormatter<AnnualDate> english = 
     ChronoFormatter.ofStyle(DisplayMode.LONG, Locale.ENGLISH, AnnualDate.chronology()); 
    System.out.println(chinese.format(ad)); // 4月6日 
    System.out.println(english.format(ad)); // Apr 6 

這也是值得大家注意的是,地方不能建設格式化後的一個合理的方式,因爲改變局部圖案結構將在施工期間凍結,並且不再適用於以後的場所變化。然而,這將在未來的版本中得到改進。

2

在這裏你去:

Calendar calendar = Calendar.getInstance(); 
    SimpleDateFormat day_week = new SimpleDateFormat("EEEE"); 
    SimpleDateFormat month_date = new SimpleDateFormat("MMMMMMMMM"); 
    Date d = new Date(); 
    String dayOfTheWeek = day_week.format(d); 
    String month = month_date.format(calendar.getTime()); 

希望它能幫助。

+1

它說喬達時間。 –

相關問題