如何在Android中使用Locale格式化日期

4
我正在使用SimpleDateFormat格式化我的日期为"dd Mmm yyy"格式,但我希望将Mmm翻译成马来语。我尝试使用以下代码进行翻译,但未能获得预期结果。
SimpleDateFormat sdf = new SimpleDateFormat(format,new Locale("ms","MY"));
return sdf.format(date);

为什么要使用“Y”而不是“y”?请参考javadoc以了解区别(关键词:基于周的年)。 - Meno Hochschild
那是一个打字错误。使用的格式是“dd MMM yyyy”。 - Komal Gupta
7个回答

5

你应该尝试这种方式来格式化本地日期:

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

我希望这个能够起作用。参考链接:Java中的本地化日期格式


4
我之前没有正确设置新的Locale构造函数来处理马来语言的支持。
String format = "MMM dd yyyy"
SimpleDateFormat sdf = new SimpleDateFormat(format, new Locale("ms","MY","MY"));
return sdf.format(date);

3

java.time

你正在使用已被证明设计不佳、令人困惑和麻烦的旧日期时间类。它们已被 Java 8 及更高版本内置的 java.time 类所取代。由 JSR 310 定义。许多功能已在 ThreeTen-Backport 项目中向 Java 6 和 7 回溯移植,并在 ThreeTenABP 项目 中进一步适配 Android。
如果你有一个 java.util.Date 对象,请将其转换为一个 Instant 对象,即 UTC 时间轴上的一个瞬间,分辨率为纳秒。新方法已添加到旧类中以方便转换。
Instant instant = myJavaUtilDate.toInstant();

或者获取当前时刻。在Java 8中,尽管Instant类具有纳秒的容量,但当前时刻仅以毫秒分辨率捕获。在Java 9中,取决于计算机硬件时钟能力,当前时刻可以以纳秒分辨率捕获。

Instant instant = Instant.now();

为想要查看挂钟时间的地区应用时区。即使是仅包含日期的值,由于日期在任何给定时刻在世界各地变化,这一点非常重要。新的一天在东方早些时候开始。

我随意选择了新西兰时区进行演示。应用ZoneId以获取ZonedDateTime对象。

使用适当的时区名称,而不是媒体中看到的3-4个字母的代码,如ISTEST。这些代码没有标准化,甚至不是唯一的。

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

时区与将文本本地化为人类语言(如马来语)无关。Locale 处理这个问题,同时定义了用于排序元素或使用句点和逗号等问题的文化规范。
我的示例假设您在指定语言和国家/文化代码方面是正确的。
Locale locale = new Locale( "ms" , "MY" );

java.time.format 包含的类可以在生成代表 java.time 值的字符串时自动进行本地化。

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

在定义格式化程序时,请记得指定Locale。如果省略,则将隐式应用您JVM的当前默认区域设置。该默认值可以在任何时刻甚至在运行时更改!因此最好始终明确表达。
formatter = formatter.withLocale( locale );
String output = zdt.format( formatter );

2016年5月23日

相比之下,使用Locale.US时:

2016年5月23日

而使用Locale.CANADA_FRENCH时:

2016-05-23


1
ZonedDateTime 需要 API 26。 - Zeeshan

1
这段代码解决了我的问题,并获得了孟加拉语的结果。
val local = Locale("bn")
val dateFormat = DateFormat.getDateInstance(DateFormat.FULL, local)
val stringDate = dateFormat.format(date)
Log.e("", stringDate)

输出结果为:

2021年2月23日,星期二


1
你需要这样做:

;

编辑1:

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

希望这能对您有所帮助。

我想在程序中将Locale编程设置为ms_MY而不是默认设备语言环境。 - Komal Gupta
需要正确设置Locale构造函数。DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, new Locale("ms","MY", "MY")); String formattedDate = dateFormat.format(new Date()); - Komal Gupta

1

我不确定下面的代码是否适用于您,它是用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

0
如果您希望将日期格式化为设备语言环境,则使用以下代码。
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());

getCurrentTimezoneOffset() 是什么? - Zeeshan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接