簡體   English   中英

如何將Calendar.getInstance與指定的Locale一起使用

[英]How to use Calendar.getInstance with specified Locale

我試圖使用具有指定Locale Calendar.getInstance(Locale l)並且無法正常工作。 我無法弄清楚我做錯了什么。

Java Doc。 說:

getInstance public static Calendar getInstance(Locale aLocale)使用默認時區和指定的語言環境獲取日歷。 返回的日歷基於具有給定語言環境的默認時區中的當前時間。 參數:aLocale - 周數據的區域設置返回:日歷。

我的代碼:

 public static void main (String[] args){

     Locale local = new Locale("pt", "BR");

     Calendar c = Calendar.getInstance(local); // here I am using the method
     System.out.println(c.getTime()); // and here, I cannot figure out why is not working


     DateFormat dt = DateFormat.getDateInstance(DateFormat.LONG, local);
     String s = dt.format(c.getTime());
     System.out.println(s); // here just a example in portuguese Brasil
 }

輸出:

4月29日星期三10:18:16 BRT 2015

29 de Abril de 2015

第一個print必須是Locale("pt", "BR") ,用葡萄牙語?

Loc答案是正確的:您對Calendar::getTime調用會生成一個java.util.Date對象。 java.util.Date類沒有顯式時區,但是在生成String時,其toString方法會混淆地應用JVM的當前默認時區。

所有非常混亂的名稱和行為 - 避免這些設計糟糕,令人困惑和麻煩的舊遺留日期時間類的許多原因中的一些。 相反,你應該使用正式取代舊類的java.time類。

java.time

UTC格式獲取當前時刻。 Instant類表示UTC時間軸上的一個時刻,分辨率為納秒 (最多九(9)位小數)。

Instant instant = Instant.now();

您可以通過調用toString創建一個String,以使用標准ISO 8601格式表示該值。

String output = instant.toString();

2016-09-28T19:38:21Z

問題中的代碼忽略了時區問題。 如果未指定時區,則會隱式應用JVM的當前默認時區。 最好明確指定。

請注意, Locale和時區是兩個完全獨立的不同問題

  • 用於確定(a)用於翻譯日期名稱,月份名稱等的人類語言的Locale ,以及(b)決定縮寫,大小寫,標點符號等問題的文化規范。
  • 時區確定用於顯示日期時間值的掛鍾時間

你可以將兩者結合起來。 例如,加爾各答印度的時區,法國區域,或巴西葡萄牙語區域​​,奧克蘭新西蘭時區。

Locale locale = new Locale("pt", "BR");
ZoneId z = ZoneId.of( "Pacific/Auckland" );

將時區應用為ZoneId以生成ZonedDateTime 從概念上講,將其視為ZonedDateTime = ( Instant + ZoneID )

continent/region格式指定適當的時區名稱 切勿使用3-4字母縮寫,例如ESTIST因為它們不是真正的時區,不是標准化的,甚至不是唯一的(!)。

ZonedDateTime zdt = instant.atZone( z );

Locale不會影響演示文稿的含義。 我們可以讓Locale對象在生成String時驅動自動本地化,以通過DateTimeFormatter類表示日期時間值。 指定FormatStyle以確定字符串應該多長或縮寫。

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL )
                                       .withLocale( locale );
String output = zdt.format( f );

轉儲到控制台。 這里看到的instantzdt對象代表了同一時刻,即時間軸上的同一點。 唯一的區別是通過鏡頭觀察不同地區的掛鍾時間。

System.out.println ( "instant.toString(): " + instant 
                     + " | zdt: " + zdt 
                     + " | output: " + output );

instant.toString():2016-09-28T20:20:38.242Z | zdt:2016-09-29T09:20:38.242 + 13:00 [太平洋/奧克蘭] | 產量:Quinta-feira,29 de Setembro de 2016 09h20min38s NZDT

轉變

避免使用舊的.Date.Calendar類。 但是,如果必須將它們與尚未針對java.time類型更新的舊代碼一起使用,則可以進行轉換。 使用添加到舊類的新方法。 這里我們調用java.util.GregorianCalendar.from( ZonedDateTime )

java.util.Calendar cal = java.util.GregorianCalendar.from( zdt ) ;

而且,走向另一個方向:

ZonedDateTime zdt = myGregorianCalendar.toZonedDateTime() ;

關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊日期時間類,如java.util.Date.Calendarjava.text.SimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time。

要了解更多信息,請參閱Oracle教程 並搜索Stack Overflow以獲取許多示例和解釋。

大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,並進一步適應的AndroidThreeTenABP (見如何使用...... )。

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

您的第一個打印是使用此打印的默認區域設置打印日期信息和Java(英語)

System.out.println(c.getTime());

此打印將執行:c.getTime()。toString()方法,此方法使用默認語言環境(英語) - 您可以查看Date.toString()源代碼以使用默認語言環境查看Java。

這就是為什么輸出是'Wed Apr 29 10:18:16 BRT 2015'

如果你想要打印輸出是葡萄牙語。 你必須使用二次打印。

暫無
暫無

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

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