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