android 获取英文日期格式,android – 如何获取月和日的语言环境日期格式

本文介绍了如何在Android中使用Joda Time库根据语言环境获取日期格式,特别是月和日的格式。通过设置适当的DateTimeFormatter和Locale,可以避免硬编码日期模式,并确保日期字符串根据用户的区域设置显示正确的格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我使用Joda Time格式化dateTime如下:

DateTimeFormatter dateFormatter = DateTimeFormat.longDate();

String startTimeStr = dateFormatter.print(localStartTime);

变量的值是:

localStartTime={org.joda.time.LocalDateTime@830018681648}"2013-04-06T23:54:35.000"

startTimeStr={java.lang.String@830018688880}"2013年4月6日"

问题是如何在月和日获得区域设置日期格式?我试过以下代码:

DateTimeFormatter monDayFormatter = DateTimeFormat.forPattern("MMMd");

String startTimeStr = monDayFormatter.print(localStartTime);

变量的值是:

localStartTime={org.joda.time.LocalDateTime@830018681648}"2013-04-06T23:54:35.000"

startTimeStr={java.lang.String@830018683220}"4月6"

我期望startTimeStr是4月6日.这里的汉字日=日.

我不想将模式硬编码为“MMMd日”,因为它应该根据当前的语言环境信息进行自我调整.任何帮助将不胜感激.

解决方法:

在unicode财团的网站上,您将在中文CLDR repository中找到例如以下条目(日历类型=格里高利):

y年M月d日EEEE

y年M月d日

y年M月d日

yy/M/d

在内部,JodaTime或JDK dateformat类中的每个本地化日期格式都将转换为这样的模式 – 包括像“日”这样的文字. CLDR没有定义仅限月 – 日的格式,但这只是一般年 – 月 – 日格式的一部分,因此如果您使用

DateTimeFormatter dateFormatter = DateTimeFormat.longDate().withLocale(Locale.CHINESE);

LocalDateTime localStartTime = new LocalDateTime(2013,4,6,23,54,35);

String startTimeStr = dateFormatter.print(localStartTime);

System.out.println(startTimeStr); // output: 2013年4月6日

这段代码:

DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("M月d日");

LocalDateTime localStartTime = new LocalDateTime(2013,4,6,23,54,35);

String startTimeStr = dateFormatter.print(localStartTime);

System.out.println(startTimeStr); // output: 4月6日

然后你得到你想要的.虽然你写道:

我不想将模式硬编码为“MMMd日”

这几乎与库内部完成的程序相同.因此,通过选择适当的文字来对模式本身进行本地化.没有办法从CLDR中提取没有年份的本地化日期模式.如果你想要这个,那么你必须为不同的语言环境管理你自己的一组本地化的月日模式,可能在Map< Locale,String>中.

2016-12-06更新:

Joda-Time没有改变任何语言环境的通用月 – 日模式的情况.不幸的是Joda-Time的官方继承者,JSR-310(java.time-package)也管理不好,请参阅JDK-issue 8168532.这足以让我找到我自己的时间库Time4J的解决方案.与此同时.对CLDR数据的密切分析表明,还有其他日期格式可用于多种语言,但在不同的部分和accessible via a group of fields中.键“Md”,“MMMd”和“MMMMd”与您的用例相关. Time4J中的示例(在未来的版本中,JSR-310也应该得到支持):

PlainTimestamp tsp = Iso8601Format.EXTENDED_DATE_TIME.parse("2013-04-06T23:54:35.000");

AnnualDate ad = AnnualDate.of(tsp.getMonth(), tsp.getDayOfMonth());

ChronoFormatter chinese =

ChronoFormatter.ofStyle(DisplayMode.LONG, Locale.CHINESE, AnnualDate.chronology());

ChronoFormatter english =

ChronoFormatter.ofStyle(DisplayMode.LONG, Locale.ENGLISH, AnnualDate.chronology());

System.out.println(chinese.format(ad)); // 4月6日

System.out.println(english.format(ad)); // Apr 6

还值得注意的是,在以合理的方式构建格式化程序之后,不能更改语言环境,因为本地化的模式结构在构造期间将被冻结,并且对于稍后的区域设置的更改不再是合理的.但是,这将在未来的版本中得到改进.

标签:android,datetime-format,locale,jodatime

来源: https://codeday.me/bug/20190612/1226347.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值