如何使用Locale将三个数字解析为LocalDate?

时间:2014-10-02 13:15:36

标签: java java-8 java-time

我正在尝试使用新的Java 8 Date and Time API将[2, 10, 2014]三个数字解析为LocalDate

一切听起来都比较容易,对吧?好吧,也许不是。
附加约束是我需要考虑区域设置,例如荷兰语和美国语使用不同的日期格式。

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

我已经知道我将需要以下步骤:

  1. Locale获取可以读取三个数字的转换器。
  2. 使用转换器,将三个数字转换为LocalDate
  3. 我已经看了一下,特别是在DateTimeFormatter课程中,但似乎想要明确地传递日,月和年格式,这对我来说不是一个选择。

    如何在LocalDate中转换三个数字(代表任何顺序中的日,月和年)?

    实施例

    荷兰语格式:

    Locale locale = new Locale("nl");
    List<String> inputs = Arrays.asList("2", "10", "2014");
    //output should equal
    LocalDate.of(2014, 10, 2);
    

    美国格式:

    Locale locale = Locale.ENGLISH;
    List<String> inputs = Arrays.asList("10", "2", "2014");
    //output should equal
    LocalDate.of(2014, 10, 2);
    

    另外请记住,我在谈论数字的概念,但它们需要表示为字符串,以适应使用其他Unicode字符而非数字0-9的语言

2 个答案:

答案 0 :(得分:3)

首先从数字创建一个字符串然后你可以使用像

这样的东西
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)));
        }
    }
}

输出

Locale : en, Str Date : 10/02/14, Parsed Date : 2014-10-02
Locale : fr, Str Date : 02/10/14, Parsed Date : 2014-10-02
Locale : ja, Str Date : 14/10/02, Parsed Date : 2014-10-02

答案 1 :(得分:1)

您可以先检索与特定区域设置相关的模式,然后根据它访问元素。您可以使用simpleDateFormat.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;
    }

}