Java 如何使用区域设置将三个数字解析为一个LocalDate?

Java 如何使用区域设置将三个数字解析为一个LocalDate?,java,java-8,java-time,Java,Java 8,Java Time,我正在尝试使用新的Java8日期和时间API将三个数字(如[2,102014]解析为LocalDate) 听起来都比较容易,对吧?嗯,也许不是。 另外一个限制是我需要考虑区域设置,例如荷兰和美国使用不同的日期格式 我仅有的输入是三个数字和区域设置,输出应该是格式良好的日期,格式为LocalDate 我认为我需要以下步骤: 从可读取三个数字的区域设置中获取转换器 使用转换器,将三个数字转换为LocalDate 我环顾了一下,特别是在DateTimeFormatter类中,但它似乎希望明确地传递日期

我正在尝试使用新的Java8日期和时间API将三个数字(如
[2,102014]
解析为
LocalDate

听起来都比较容易,对吧?嗯,也许不是。
另外一个限制是我需要考虑区域设置,例如荷兰和美国使用不同的日期格式

我仅有的输入是三个数字和区域设置,输出应该是格式良好的日期,格式为
LocalDate

我认为我需要以下步骤:

  • 从可读取三个数字的
    区域设置中获取转换器
  • 使用转换器,将三个数字转换为
    LocalDate
  • 我环顾了一下,特别是在
    DateTimeFormatter
    类中,但它似乎希望明确地传递日期、月份和年份格式,这对我来说不是一个选项

    如何在
    LocalDate
    中转换三个数字(以any顺序表示日、月和年)

    示例

    荷兰语格式:

    Locale locale = new Locale("nl");
    List<String> inputs = Arrays.asList("2", "10", "2014");
    //output should equal
    LocalDate.of(2014, 10, 2);
    
    Locale=新语言环境(“nl”);
    列表输入=数组。asList(“2”、“10”、“2014”);
    //产出应该相等
    本地日期(2014年10月2日);
    
    美式格式:

    Locale locale = Locale.ENGLISH;
    List<String> inputs = Arrays.asList("10", "2", "2014");
    //output should equal
    LocalDate.of(2014, 10, 2);
    
    Locale=Locale.ENGLISH;
    列表输入=数组。asList(“10”、“2”、“2014”);
    //产出应该相等
    本地日期(2014年10月2日);
    

    请记住,我说的是数字的概念,但它们需要表示为字符串,以适应使用数字0-9以外的其他Unicode字符作为数字的语言。

    首先从数字创建字符串,然后可以使用

    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;
    import java.time.format.DateTimeFormatterBuilder;
    import java.time.format.FormatStyle;
    import java.util.Locale;
    
    public class IntegerDateTest {
    
        public static void main(String args[]) {
            int[][] dates = {{10, 02, 2014}, {02, 10, 2014}, {2014, 10, 02}};
            Locale[] locales = {Locale.ENGLISH, Locale.FRENCH, Locale.JAPANESE};
    
            for (int i = 0; i < 3; i++) {
                int[] dateParts = dates[i];
                Locale locale = locales[i];
                String date = String.format("%02d/%02d/%02d", dateParts[0] % 100,
                        dateParts[1] % 100, dateParts[2] % 100);
                System.out.printf("Locale : %s, Str Date : %s,", locale, date);
                DateTimeFormatter df = new DateTimeFormatterBuilder().append(
                        DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT))
                        .toFormatter(locale);
                System.out.printf(" Parsed Date : %s\n",LocalDate.from(df.parse(date)));
            }
        }
    }
    
    import java.time.LocalDate;
    导入java.time.format.DateTimeFormatter;
    导入java.time.format.DateTimeFormatterBuilder;
    导入java.time.format.FormatStyle;
    导入java.util.Locale;
    公共类IntegerDateTest{
    公共静态void main(字符串参数[]){
    int[][]日期={10,02,2014},{02,10,2014},{2014,10,02};
    Locale[]locales={Locale.ENGLISH,Locale.FRENCH,Locale.JAPANESE};
    对于(int i=0;i<3;i++){
    int[]dateParts=日期[i];
    语言环境=语言环境[i];
    字符串日期=String.format(“%02d/%02d/%02d”,日期部分[0]%100,
    日期部分[1]%100,日期部分[2]%100);
    System.out.printf(“区域设置:%s,Str日期:%s,”,区域设置,日期);
    DateTimeFormatter df=新建DateTimeFormatterBuilder().append(
    CalizedDate的DateTimeFormatter.ofCalizedDate(FormatStyle.SHORT))
    .toFormatter(区域设置);
    System.out.printf(“解析日期:%s\n”,LocalDate.from(df.parse(Date));
    }
    }
    }
    
    输出 地点:en,Str日期:2014年2月10日,解析日期:2014年10月2日 地点:fr,Str日期:2014年10月2日,解析日期:2014年10月2日 地点:ja,Str日期:14/10/02,解析日期:2014-10-02
    您可以首先检索与特定区域设置相关的模式,然后根据该模式访问元素。您可以使用
    SimpleDataFormat.toPattern()
    检索与特定语言环境相关联的模式。下面是一个示例代码

    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.time.LocalDate;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Locale;
    import java.util.Map;
    
    public class T {
    
        public static void main(String[] args) throws ParseException {
            Locale enLocale = Locale.ENGLISH;
            Locale nlLocale = new Locale("nl");         
    
            List<String> enInput = Arrays.asList("10", "2", "2014");
            List<String> nlInput = Arrays.asList("2", "10", "2014");
            Map<String, Integer> enPositionMap = getPositionMap(enLocale, enInput);
            Map<String, Integer> nlPositionMap = getPositionMap(nlLocale, nlInput);
            System.out.println("EN date " + LocalDate.of(enPositionMap.get("y"), enPositionMap.get("m"), enPositionMap.get("d")));
            System.out.println("NL date " + LocalDate.of(nlPositionMap.get("y"), nlPositionMap.get("m"), nlPositionMap.get("d")));
    
        }
    
        public static Map<String, Integer> getPositionMap(Locale locale, List<String> input) {
            final DateFormat dateInstance = DateFormat.getDateInstance(DateFormat.SHORT, locale);
    
            Map<String, Integer> map = new HashMap<>();
    
            if (dateInstance instanceof SimpleDateFormat) {
                String pattern = ((SimpleDateFormat) dateInstance).toPattern();
                String separator = String.valueOf(pattern.charAt(1));
    
                String[] chunks = pattern.split(separator);
    
                for (int i = 0; i < chunks.length; i++) {
                    switch (chunks[i]) {
                        case "M":
                            map.put("m", Integer.parseInt(input.get(i)));
                            break;
                        case "d":
                            map.put("d", Integer.parseInt(input.get(i)));
                            break;
                        case "yy":
                            map.put("y", Integer.parseInt(input.get(i)));
                            break;
                    }
                }
    
            }
    
            return map;
        }
    
    }
    
    导入java.text.DateFormat;
    导入java.text.ParseException;
    导入java.text.simpleDataFormat;
    导入java.time.LocalDate;
    导入java.util.array;
    导入java.util.HashMap;
    导入java.util.List;
    导入java.util.Locale;
    导入java.util.Map;
    公共T类{
    公共静态void main(字符串[]args)引发异常{
    Locale enLocale=Locale.ENGLISH;
    语言环境nlLocale=新语言环境(“nl”);
    列表输入=数组。asList(“10”、“2”、“2014”);
    List nlInput=数组。asList(“2”、“10”、“2014”);
    Map enPositionMap=getPositionMap(放大,放大);
    Map nlPositionMap=getPositionMap(nlLocale,nlInput);
    System.out.println(“EN date”+LocalDate.of(enPositionMap.get(“y”)、enPositionMap.get(“m”)、enPositionMap.get(“d”);
    System.out.println(“NL date”+LocalDate.of(nlPositionMap.get(“y”)、nlPositionMap.get(“m”)、nlPositionMap.get(“d”);
    }
    公共静态映射getPositionMap(区域设置,列表输入){
    final DateFormat dateInstance=DateFormat.getDateInstance(DateFormat.SHORT,区域设置);
    Map Map=newhashmap();
    if(SimpleDataFormat的dateInstance实例){
    字符串模式=((SimpleDataFormat)dateInstance).toPattern();
    字符串分隔符=String.valueOf(pattern.charAt(1));
    String[]chunks=pattern.split(分隔符);
    for(int i=0;i
    Dirty solution:也许是一个将区域设置映射到特定日期格式的实用程序?从日期格式可以推断出数字的顺序(其中一个是日、月和年)@gtgaxiola我希望有人已经制作了这样的东西,或者它是API的一部分,但我找不到,但我可能错了。@skiwi肯定我在API中没有看到过,我不知道社区中是否存在这样的项目。如果找不到,请创建它并将其开源!或者悬赏,有人会的@assylias我假设输入为[2,102014]Locale.nl_nl(例如荷兰语),这将给出2014年10月2日。。。同时[2,102014]Locale.en_US(美国)将于2月10日,2014@assylias刚才添加了示例。我认为OP的意思是
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.time.LocalDate;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Locale;
    import java.util.Map;
    
    public class T {
    
        public static void main(String[] args) throws ParseException {
            Locale enLocale = Locale.ENGLISH;
            Locale nlLocale = new Locale("nl");         
    
            List<String> enInput = Arrays.asList("10", "2", "2014");
            List<String> nlInput = Arrays.asList("2", "10", "2014");
            Map<String, Integer> enPositionMap = getPositionMap(enLocale, enInput);
            Map<String, Integer> nlPositionMap = getPositionMap(nlLocale, nlInput);
            System.out.println("EN date " + LocalDate.of(enPositionMap.get("y"), enPositionMap.get("m"), enPositionMap.get("d")));
            System.out.println("NL date " + LocalDate.of(nlPositionMap.get("y"), nlPositionMap.get("m"), nlPositionMap.get("d")));
    
        }
    
        public static Map<String, Integer> getPositionMap(Locale locale, List<String> input) {
            final DateFormat dateInstance = DateFormat.getDateInstance(DateFormat.SHORT, locale);
    
            Map<String, Integer> map = new HashMap<>();
    
            if (dateInstance instanceof SimpleDateFormat) {
                String pattern = ((SimpleDateFormat) dateInstance).toPattern();
                String separator = String.valueOf(pattern.charAt(1));
    
                String[] chunks = pattern.split(separator);
    
                for (int i = 0; i < chunks.length; i++) {
                    switch (chunks[i]) {
                        case "M":
                            map.put("m", Integer.parseInt(input.get(i)));
                            break;
                        case "d":
                            map.put("d", Integer.parseInt(input.get(i)));
                            break;
                        case "yy":
                            map.put("y", Integer.parseInt(input.get(i)));
                            break;
                    }
                }
    
            }
    
            return map;
        }
    
    }