Java / Android:如何获取用户语言和国家/地区的完整日期字符串?

时间:2017-03-10 18:09:45

标签: java android date

我想获取给定用户语言/国家/地区的当前日期。 E.g:

  • '2017年3月10日星期五'(英国的英语用户;也许是2017年3月10日星期五'在其他一些英语国家)
  • 'Vendredi 10 mars 2017'(法国法国用户)
  • 'Freitag,10.März2017'供德国用户使用

等...

也许我没有在SO和网络上正确搜索,但我找不到方便的答案......

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以像这样使用SimpleDateFormat类传递默认语言环境

SimpleDateFormat dateformat = new SimpleDateFormat(timeFormat, Locale.ENGLISH);

答案 1 :(得分:0)

TL;博士

LocalDate.now( ZoneId.of( "America/Montreal" ) )                    // Capture the current date, “today”.
         .format(                                                   // Generate a string.
             DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL )  // Automatically localize.
                              .withLocale( Locale.CANADA_FRENCH )   // Specify human language for translation and cultural norms for formatting.
         )

使用java.time

将ThreeTenABP库添加到您的项目中。该库适用于Android的ThreeTen-Backport项目,后端到Java 6& 7 java.time类的大部分功能。 java.time类内置于Java 8及更高版本中。 java.time类取代了众所周知的麻烦遗留日期时间类,例如DateCalendar

获取所需/预期时区的当前日期。我建议养成始终明确指定时区的习惯,而不是隐式依赖JVM的当前默认时区。

LocalDate类表示没有时间且没有时区的仅限日期的值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate localDate = LocalDate.now( z );

您可以通过调用ZoneId.systemDefault来获取JVM当前的默认时区。请记住,当前默认值可以随时由该JVM中任何应用程序的任何线程中的任何代码更改。因此,如果时区很重要,请与用户确认。

生成一个字符串,用DateTimeFormatter个对象表示该值。您可以指定格式模式。但是你想要一个本地化的值,所以让DateTimeFormatter做到这一点。

要进行本地化,请指定:

  • FormatStyle确定字符串的长度或缩写。
  • Locale确定(a)翻译日期名称,月份名称等的人类语言,以及(b)决定缩写,大小写,标点符号,分隔符问题的文化规范等等。

    Locale locale = Locale.CANADA_FRENCH; DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withLocale(locale);

生成你的字符串。

String output = localDate.format( f );

关于java.time

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

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

答案 2 :(得分:0)

如果您在不使用外部库的情况下在Android 上查找内置方式,那么旧式类java.text.DateFormat是获得指定格式化程序的格式化程序的最佳起点区域设置,不知道确切的格式模式。请参阅javadoc

DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE);
String formattedCurrentDate = df.format(new Date());