[英]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類。
以UTC格式獲取當前時刻。 Instant
類表示UTC時間軸上的一個時刻,分辨率為納秒 (最多九(9)位小數)。
Instant instant = Instant.now();
您可以通過調用toString
創建一個String,以使用標准ISO 8601格式表示該值。
String output = instant.toString();
2016-09-28T19:38:21Z
問題中的代碼忽略了時區問題。 如果未指定時區,則會隱式應用JVM的當前默認時區。 最好明確指定。
請注意, Locale
和時區是兩個完全獨立的不同問題 。
你可以將兩者結合起來。 例如,加爾各答印度的時區,法國區域,或巴西葡萄牙語區域,奧克蘭新西蘭時區。
Locale locale = new Locale("pt", "BR");
ZoneId z = ZoneId.of( "Pacific/Auckland" );
將時區應用為ZoneId
以生成ZonedDateTime
。 從概念上講,將其視為ZonedDateTime = ( Instant + ZoneID )
。
以continent/region
格式指定適當的時區名稱 。 切勿使用3-4字母縮寫,例如EST
或IST
因為它們不是真正的時區,不是標准化的,甚至不是唯一的(!)。
ZonedDateTime zdt = instant.atZone( z );
Locale
不會影響演示文稿的含義。 我們可以讓Locale
對象在生成String時驅動自動本地化,以通過DateTimeFormatter
類表示日期時間值。 指定FormatStyle
以確定字符串應該多長或縮寫。
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL )
.withLocale( locale );
String output = zdt.format( f );
轉儲到控制台。 這里看到的instant
和zdt
對象代表了同一時刻,即時間軸上的同一點。 唯一的區別是通過鏡頭觀察不同地區的掛鍾時間。
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 8及更高版本中。 這些類取代了麻煩的舊日期時間類,如java.util.Date
, .Calendar
和java.text.SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time。
要了解更多信息,請參閱Oracle教程 。 並搜索Stack Overflow以獲取許多示例和解釋。
大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,並進一步適應的Android在ThreeTenABP (見如何使用...... )。
ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
您的第一個打印是使用此打印的默認區域設置打印日期信息和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.