Locale类或DateTimeFormatter(java8)的奇怪行为

Locale类或DateTimeFormatter(java8)的奇怪行为,java,datetime,java-8,locale,datetime-format,Java,Datetime,Java 8,Locale,Datetime Format,我正在使用Java8java.Time包为我的项目编写一个日期时间包装器,在这个包中,用户将向我传递一个模式、语言和他的时区id(例如Asia/kolkata等),在此基础上我将输出LocalDateTime对象(作为字符串)按照他喜欢的时区。所以基本上我有这个方法的签名 public static String getDateTime(String pattern, String language, String timezone){} 为了获取时区优先时间,我使用了ZonedDateTim

我正在使用Java8
java.Time
包为我的项目编写一个日期时间包装器,在这个包中,用户将向我传递一个模式、语言和他的时区id(例如
Asia/kolkata
等),在此基础上我将输出LocalDateTime对象(作为字符串)按照他喜欢的时区。所以基本上我有这个方法的签名

public static String getDateTime(String pattern, String language, String timezone){}
为了获取时区优先时间,我使用了
ZonedDateTime
,这很好,但在获取语言加模式特定格式时,我面临一种奇怪的行为。我正在使用
publicstaticdatetimeformatterofpattern(stringpattern,Locale)
在编写任何具体结构之前,我只是尝试使用基本示例继续,但对于相同的操作,我得到了不同的结果。检查下面提到的2个程序-

      public static void main(String[] args) {
        String lang = "hi";    
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd-MMM-yyyy,HH:mm", new Locale("hi","IN"));
        System.out.println("Date:"+ LocalDateTime.now().format(dateTimeFormatter));
      }
输出:

Date:16-अगस्त-2016,14:30
    Lang:hi,Country:IN
    Lang:hi,Country:
    Date:16-Aug-2016,15:18
现在,我得到了(印度印地语)中语言环境的预期输出,但是现在,当我想到通过使用已经可用的语言环境对象而不是使用
新的语言环境(字符串语言,字符串国家)
来优化它时,我没有得到结果,我做了如下操作:

            public class App2 {
              // using map to act as a cache for the Key:Language and Value: Locale 
              private static Map<String,Locale> localeMap = new HashMap<String, Locale>();

              public static void main(String[] args) {
                String lang = "hi";
                if (localeMap.get(lang) == null) {
                  for (Locale locale1 : Locale.getAvailableLocales()) {
                    if (locale1.getLanguage().equals(lang)) {
             System.out.println("Lang:"+locale1.getLanguage()+",Country:"+locale1.getCountry());
             localeMap.put(lang, locale1);
                    }
                  }
                }
        DateTimeFormatter.ofPattern("dd-MMM-yyyy,HH:mm", localeMap.get(lang));
                System.out.println("Date:"+ LocalDateTime.now().format(dateTimeFormatter));
              }
            }
注意:

Date:16-अगस्त-2016,14:30
    Lang:hi,Country:IN
    Lang:hi,Country:
    Date:16-Aug-2016,15:18
  • “hi”
    对应的区域设置已存在于中

    对于(locale1:Locale.getAvailableLocales()){ 如果(locale1.getLanguage().equals(“hi”)不为null }

  • 问题:

    Date:16-अगस्त-2016,14:30
    
        Lang:hi,Country:IN
        Lang:hi,Country:
        Date:16-Aug-2016,15:18
    
  • 为什么上述方法的输出不同已解决[语言为“hi”的地区有多个条目]

  • 我还想知道为什么我不能用那种语言得到数字。我得到的是印地语的月份名称(用于新的地区(“hi”,“in”)),但不是日期和时间的数字。(例如,我想要数字)०,१,२,३,४,५,६,७,८,९,१० - 这是0,1,2,3,4..10的印地语版本)

  • 我还观察到,如果我记录locale1.getLanguage和locale1.getCountry(),则有两个条目lang:hi和Country:IN,lang:hi和Country:“(空字符串)对于其他语言环境也是如此。我观察到这种行为(语言存在,但没有国家)。有什么原因吗

  • 编辑1: 在map中插入sopln之后,如果在循环
    中添加一个额外的检查,我看到有两个语言是印地语的地区!locale1.getCountry().isEmpty()和&locale1.getLanguage().equals(lang)
    ;我得到了预期的输出。现在在Locale类中,也有Locale(字符串语言)的构造函数。它似乎也不适用于“hi”,但适用于“zh”-这是中文的,它为zh和locale对象提供多个条目,最后一次插入时,country有空值,类似于“hi”行为,但我得到了中文输出。基本上,这意味着要问3个问题

    Lang:zh,Country:TW
    Lang:zh,Country:HK
    Lang:zh,Country:SG
    Lang:zh,Country:CN
    Lang:zh,Country:
    Date:16-八月-2016,17:14
    

    对于你在地图上的位置,你看到的是哪个国家?如果你想要一个印度国家,你应该指定。。。(老实说,你说的“不是日期和时间的数字”是什么意思也不清楚。)@JonSkeet我已经编辑了这个问题!!。我已经在地图上插入了sopln,我得到的国家是in,朗是hi。对于数字,我还编辑了第2点。但是是的,我想指出的是,对于语言来说,没有国家,有时我对“hi”一词根本没有国家。是的,语言环境形成了一个有效的层次结构。。。因此,对于任何语言,我都希望看到一个地区没有国家。基本上,如果您希望区域设置的语言为
    hi
    ,国家为
    IN
    ,这就是您应该测试的…谢谢。语言环境层次结构是这种行为的原因,如果您能澄清我对问题2和edit1的疑问[为什么没有国家的“zh”可以正常工作,但“hi”不行]这是一个数据的哪些部分与语言相关,哪些与国家相关的问题。如果你想查看所涉及的原始数据,请转到。那么对于你在地图中输入的地区,你看到的是哪个国家?如果你想要一个印度国家,你应该指定。。。(老实说,你说的“不是日期和时间的数字”是什么意思也不清楚。)@JonSkeet我已经编辑了这个问题!!。我已经在地图上插入了sopln,我得到的国家是in,朗是hi。对于数字,我还编辑了第2点。但是是的,我想指出的是,对于语言来说,没有国家,有时我对“hi”一词根本没有国家。是的,语言环境形成了一个有效的层次结构。。。因此,对于任何语言,我都希望看到一个地区没有国家。基本上,如果您希望区域设置的语言为
    hi
    ,国家为
    IN
    ,这就是您应该测试的…谢谢。语言环境层次结构是这种行为的原因,如果您能澄清我对问题2和edit1的疑问[为什么没有国家的“zh”可以正常工作,但“hi”不行]这是一个数据的哪些部分与语言相关,哪些与国家相关的问题。如果要查看所涉及的原始数据,请转到。