日期和时间格式设置取决于区域设置tl;博士java.time关于 java.time

2022-09-01 08:15:08

我是Java和Android开发的新手,所以这可能是一个愚蠢的问题,但我已经搜索了好几天,找不到解决方案:

我尝试根据用户的区域设置输出一个。java.util.Date

在StackOverflow上搜索导致我这样做:

java.util.Date date = new Date();
String dateString = DateFormat.getDateFormat(getApplicationContext()).format(date);

此输出:

20/02/2011

在我的法语本地化手机上。几乎没问题。

如何使用用户的区域设置输出 的小时、分钟和秒部分?我一直在寻找Android文档,但找不到任何东西。Date

非常感谢。


答案 1

android.text.format.DateFormat.getTimeFormat()

参考文献: http://developer.android.com/reference/android/text/format/DateFormat.html


答案 2

tl;博士

ZonedDateTime                                   // Represent a moment as seen in the wall-clock time used by the people of a particular region (a time zone). 
.now( ZoneId.of( "Asia/Kolkata" ) )             // Capture the current moment as seen in the specified time zone. Returns a `ZonedDateTime` object.
.format(                                        // Generate text representing the value of this `ZonedDateTime` object.
    DateTimeFormatter                           // Class controlling the generation of text representing the value of a date-time object.
    .ofLocalizedDateTime ( FormatStyle.FULL )   // Automatically localize the string representing this date-time value.
    .withLocale ( Locale.FRENCH )               // Specify the human language and cultural norms used in localizing.
)                                               // Return a `String` object.

java.time

Question 中的代码使用麻烦的旧日期时间类,这些类现在是遗留的,被 Java 8 及更高版本中内置的 java.time 类所取代。

区域设置和时区彼此无关。区域设置确定生成 String 以表示日期时间值时使用的人类语言和文化规范。时区确定用于表示时间轴上某个时刻的特定区域的挂钟时间

Instant 类以 UTC 格式表示时间轴上的某个时刻,分辨率为纳秒(最多九 (9) 位小数)。

Instant instant = Instant.now();

2016-10-12T07:21:00.264Z

应用时区以获取 .我随意选择使用印度时区来显示这一刻。同一时刻,时间轴上的同一点。ZonedDateTime

ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = instant.atZone( z );

2016-10-12T12:51:00.264+05:30[亚洲/加尔各答]

使用魁北克加拿大的区域设置生成字符串。让 java.time 自动本地化字符串。

Locale l = Locale.CANADA_FRENCH;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL ).withLocale ( l );
String output = zdt.format ( f );  // Indian time zone with Québécois presentation/translation.

Mercredi 12 Octobre 2016 12 h 51 IST


关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,如java.util.Date。Calendar, & java.text.SimpleDateFormat.

Joda-Time项目现在处于维护模式,建议迁移到java.time。

要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310

从哪里获取 java.time 类?

ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter

显示何时使用 java.time、ThreeTenABP 或 Android desugaring API 的图表