如何在 Android 中使用语言环境格式化日期

How can I format Date with Locale in Android

我正在使用 SimpleDateFormat 来格式化我的日期 "dd Mmm yyy" 格式,但我希望将 Mmm 翻译成马来语。我正在使用下面的代码来这样做,但无法获得预期的结果。

SimpleDateFormat sdf = new SimpleDateFormat(format,new Locale("ms","MY"));
return sdf.format(date);

你需要这样做;

编辑 1:

DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, new Locale("ms","MY"));
String formattedDate = dateFormat.format(new Date());

希望对您有所帮助。

我不确定下面的代码是否适合你,它是用 Scala 编写的,它在 Java 中几乎相同。

val malaysia = new Locale("ms","MY","MY")
val cal = Calendar.getInstance(malaysia)
val df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, malaysia)
println(df.format(cal.getTime()))

以上代码的结果是

Isnin 23 Mei 2016 9:55:44 AM IST

您应该尝试使用这种方式来格式化语言环境日期:

DateFormat f = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.getDefault());
String formattedDate = f.format(new Date());
System.out.println("Date: " + formattedDate);

我希望这会奏效。参考link:Localized date format in Java

如果您希望将日期格式化为设备区域设置,请使用以下代码

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date newDate = format.parse(strDate2);
        long milliDate = newDate.getTime()+getCurrentTimezoneOffset();
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(milliDate);
        return format.format(cal.getTime());

java.time

您使用的是旧的日期时间 classes,它们已被证明设计不佳、令人困惑且麻烦。它们已被 java.time classes built into Java 8 and later. Defined by JSR 310. Much of that functionality has been back-ported to Java 6 & 7 in the ThreeTen-Backport project and further adapted to Android in the ThreeTenABP project.

取代

如果您有一个 java.util.Date 对象,请将其转换为一个 Instant 对象,UTC 时间轴上的一个时刻,分辨率为纳秒。已将新方法添加到旧的 classes 以方便转换。

Instant instant = myJavaUtilDate.toInstant();

或获取当前时刻。在 Java 8 中,当前时刻仅以毫秒分辨率捕获,尽管 Instant class 的容量为纳秒。在 Java 9 中,当前时刻的捕捉分辨率高达纳秒级(取决于您的计算机硬件时钟能力)。

Instant instant = Instant.now();

为您要查看挂钟时间的地区应用时区。这对于纯日期值也很重要,因为世界各地的日期在任何给定时刻都在变化。新的一天在东方开始了。

我随便选了一个新西兰时区,做示范。应用一个 ZoneId to get a ZonedDateTime 对象。

使用proper time zone names,永远不要使用您在媒体上看到的3-4 个字母的代码,例如ISTEST。这样的代码不是标准化的,甚至不是唯一的。

ZoneId zoneId = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

时区与本地化为人类语言(例如马来语)无关。 Locale 处理这个问题,并定义文化规范以用于诸如元素排序或使用句号与逗号之类的问题。

我的示例假定您在指定语言和 country/culture 代码方面是正确的。

Locale locale = new Locale( "ms" , "MY" );

java.time.format 包有 classes 可以在生成表示 java.time 值的字符串时自动本地化。

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM );

定义格式化程序时,请记住指定 Locale。如果省略,将隐式应用 JVM 当前的默认 Locale。该默认值可以随时更改,即使在运行时也是如此!所以最好总是明确。

formatter = formatter.withLocale( locale );
String output = zdt.format( formatter );

23 Mei 2016

使用Locale.US时对比:

May 23, 2016

并且当使用 Locale.CANADA_FRENCH 时:

2016-05-23

我没有正确设置新的 Locale 构造函数来处理马来语支持。

String format = "MMM dd yyyy"
SimpleDateFormat sdf = new SimpleDateFormat(format, new Locale("ms","MY","MY"));
return sdf.format(date);

这段代码解决了我的问题并得到了孟加拉语的结果。

val local = Locale("bn")
val dateFormat = DateFormat.getDateInstance(DateFormat.FULL, local)
val stringDate = dateFormat.format(date)
Log.e("", stringDate)

输出为:

মঙ্গলবার, ২৩ ফেব্রুয়ারী, ২০২১