我正在尝试将Calendar.getInstance(Locale l)
与指定的Locale
一起使用,但无效。我无法弄清楚我做错了什么。
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
}
输出:
Wed Apr 29 10:18:16 BRT 2015
29 de Abril de 2015
第一个print
是否必须在Locale("pt", "BR")
中,用葡萄牙语?
答案 0 :(得分:3)
Answer by Loc是正确的:您对Calendar::getTime
的调用会产生java.util.Date
个对象。 java.util.Date
类没有明确的时区,但toString
方法在生成字符串时会混淆地应用JVM的当前默认时区。
所有非常令人困惑的名称和行为 - 一些许多的理由,以避免这些设计糟糕,令人困惑和麻烦的旧遗留日期时间类。相反,你应该使用正式取代旧类的java.time类。
获取UTC中的当前时刻。 Instant
类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位数字)。
Instant instant = Instant.now();
您可以通过调用toString
创建一个字符串,以标准ISO 8601格式表示该值。
String output = instant.toString();
2016-09-28T19:38:21Z
问题中的代码忽略了时区问题。如果未指定时区,则会隐式应用JVM的当前默认时区。最好明确指定。
请注意, Locale
和时区是两个完全独立的不同问题。
Locale
确定(a)翻译日期名称,月份名称等的人类语言,以及(b)决定缩写,大小写,标点符号等问题的文化规范。< / LI>
你可以将两者结合起来。例如,加尔各答印度的时区,法国区域,或巴西葡萄牙语区域,奥克兰新西兰时区。
Locale locale = new Locale("pt", "BR");
ZoneId z = ZoneId.of( "Pacific/Auckland" );
将时区应用为ZoneId
以生成ZonedDateTime
。从概念上讲,将其视为ZonedDateTime = ( Instant + ZoneID )
。
以continent/region
的格式指定proper time zone name。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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
和&amp; java.text.SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:2)
您的第一次打印只是打印日期信息&amp; Java使用默认语言环境进行此打印(英语)
System.out.println(c.getTime());
此打印将执行:c.getTime()。toString()方法,此方法使用默认语言环境(ENGLISH) - 您可以查看Date.toString()源代码,以使用默认语言环境查看Java。 / p>
这就是为什么输出是&#39; Wed Apr 29 10:18:16 BRT 2015&#39;
如果您想要打印输出是葡萄牙语。你必须使用二次打印。