我使用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