繁体   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