ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-06-12 15:15:35  阅读:290  来源: 互联网

标签:android datetime-format locale jodatime


我使用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中找到例如以下条目(日历类型=格里高利):

<dateFormats>
  <dateFormatLength type="full">
     <dateFormat>
    <pattern>y年M月d日EEEE</pattern>
     </dateFormat>
  </dateFormatLength>
  <dateFormatLength type="long">
     <dateFormat>
        <pattern>y年M月d日</pattern>
     </dateFormat>
  </dateFormatLength>
  <dateFormatLength type="medium">
     <dateFormat>
       <pattern>y年M月d日</pattern>
     </dateFormat>
  </dateFormatLength>
  <dateFormatLength type="short">
     <dateFormat>
       <pattern>yy/M/d</pattern>
     </dateFormat>
  </dateFormatLength>
</dateFormats>

在内部,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<AnnualDate> chinese =
        ChronoFormatter.ofStyle(DisplayMode.LONG, Locale.CHINESE, AnnualDate.chronology());
    ChronoFormatter<AnnualDate> 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有