有没有办法用 java 8 流更改日期格式?
Is there a way to change dateFormat with java 8 stream?
我想在 java8 流
中用一行将日期格式从“dd/mm/yyyy
”更改为“yyyy/mm/dd
”
List<String[]> date = new ArrayList<>();
String[] a= {"12/2/2018","a1","a2"};
String[] b= {"13/3/2018","b1","b2"};
String[] c= {"14/4/2018","c1","c2"};
date.add(a)`
date.add(b);
date.add(c);
我希望输出是
{{"2018/2/12","a1","a2"},{"2018/2/13","b1","b2"},{"2018/2/14","c1","c2"}}
我希望你的意思是 yyyy/MM/dd
因为 m 代表分钟,M 代表月...
考虑来自流的 Map API
public static void main(String[] args) {
List<String[]> date = new ArrayList<>();
String[] a= {"12/2/2018","a1","a2"};
String[] b= {"13/3/2018","b1","b2"};
String[] c= {"14/4/2018","c1","c2"};
date.add(a);
date.add(b);
date.add(c);
List<String[]> even = date.stream().map(
s -> {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/yyyy");
LocalDate localDate = LocalDate.parse(s[0], formatter);
DateTimeFormatter formatterNew = DateTimeFormatter.ofPattern("yyyy/MM/dd");
return new String[]{formatterNew.format(localDate), s[1],s[2]};
}
).collect(Collectors.toList());
even.forEach(x-> System.out.println(Arrays.toString(x)));
}
将打印出来
[2018/02/12, a1, a2]
[2018/03/13, b1, b2]
[2018/04/14, c1, c2]
如果不遍历所有项目,则无法执行此操作。
对于你的简单案例 dd/mm/yyyy
到 yyyy/mm/dd
你可以只使用这个:
date.forEach(i -> {
String[] parts = i[0].split("/");
i[0] = parts[2] + "/" + parts[1] + "/" + parts[0];
});
使用 java 时间 api 你可以使用这个:
DateTimeFormatter toFormat = DateTimeFormatter.ofPattern("yyyy/M/d");
DateTimeFormatter fromFormat = DateTimeFormatter.ofPattern("d/M/yyyy");
date.forEach(i -> i[0] = LocalDate.parse(i[0], fromFormat).format(toFormat));
您可以使用 java 8 个流来完成此操作,但不能在一行中进行。使用两种日期模式,一种用于输入,另一种用于输出
DateTimeFormatter inFormat = DateTimeFormatter.ofPattern("dd/M/yyyy");
DateTimeFormatter outFormat = DateTimeFormatter.ofPattern("yyyy/M/dd");
List<String[]> date = new ArrayList<>();
String[] a= {"12/2/2018","a1","a2"};
String[] b= {"13/3/2018","b1","b2"};
String[] c= {"14/4/2018","c1","c2"};
date.add(a);
date.add(b);
date.add(c);
//Since it is String array need lambda expression to update and return
List<String[]> result = date.stream().map(arr->{
arr[0]=LocalDate.parse(arr[0],inFormat).format(outFormat);
return arr;
}).collect(Collectors.toList());
为什么要使用流?
DateTimeFormatter originalFormatter = DateTimeFormatter.ofPattern("d/M/u");
DateTimeFormatter wantedFormatter = DateTimeFormatter.ofPattern("u/M/d");
date.forEach(arr -> {
LocalDate ld = LocalDate.parse(arr[0], originalFormatter);
arr[0] = ld.format(wantedFormatter);
});
检查结果:
date.forEach(arr -> System.out.println(Arrays.toString(arr)));
输出:
[2018/2/12, a1, a2]
[2018/3/13, b1, b2]
[2018/4/14, c1, c2]
我的代码(以及其他一些答案中的代码)修改了您的原始数组。请决定是否可以。如果是,你不应该真正使用流,因为它们应该没有副作用。如果您确实需要原始数组保持不变,流就可以了(使用与以前相同的格式化程序):
List<String[]> newDateList = date.stream()
.map(arr -> {
LocalDate ld = LocalDate.parse(arr[0], originalFormatter);
String[] newArr = Arrays.copyOf(arr, arr.length);
newArr[0] = ld.format(wantedFormatter);
return newArr;
})
.collect(Collectors.toList());
newDateList.forEach(arr -> System.out.println(Arrays.toString(arr)));
输出与之前相同。
我想在 java8 流
中用一行将日期格式从“dd/mm/yyyy
”更改为“yyyy/mm/dd
”
List<String[]> date = new ArrayList<>();
String[] a= {"12/2/2018","a1","a2"};
String[] b= {"13/3/2018","b1","b2"};
String[] c= {"14/4/2018","c1","c2"};
date.add(a)`
date.add(b);
date.add(c);
我希望输出是
{{"2018/2/12","a1","a2"},{"2018/2/13","b1","b2"},{"2018/2/14","c1","c2"}}
我希望你的意思是 yyyy/MM/dd
因为 m 代表分钟,M 代表月...
考虑来自流的 Map API
public static void main(String[] args) {
List<String[]> date = new ArrayList<>();
String[] a= {"12/2/2018","a1","a2"};
String[] b= {"13/3/2018","b1","b2"};
String[] c= {"14/4/2018","c1","c2"};
date.add(a);
date.add(b);
date.add(c);
List<String[]> even = date.stream().map(
s -> {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/yyyy");
LocalDate localDate = LocalDate.parse(s[0], formatter);
DateTimeFormatter formatterNew = DateTimeFormatter.ofPattern("yyyy/MM/dd");
return new String[]{formatterNew.format(localDate), s[1],s[2]};
}
).collect(Collectors.toList());
even.forEach(x-> System.out.println(Arrays.toString(x)));
}
将打印出来
[2018/02/12, a1, a2]
[2018/03/13, b1, b2]
[2018/04/14, c1, c2]
如果不遍历所有项目,则无法执行此操作。
对于你的简单案例 dd/mm/yyyy
到 yyyy/mm/dd
你可以只使用这个:
date.forEach(i -> {
String[] parts = i[0].split("/");
i[0] = parts[2] + "/" + parts[1] + "/" + parts[0];
});
使用 java 时间 api 你可以使用这个:
DateTimeFormatter toFormat = DateTimeFormatter.ofPattern("yyyy/M/d");
DateTimeFormatter fromFormat = DateTimeFormatter.ofPattern("d/M/yyyy");
date.forEach(i -> i[0] = LocalDate.parse(i[0], fromFormat).format(toFormat));
您可以使用 java 8 个流来完成此操作,但不能在一行中进行。使用两种日期模式,一种用于输入,另一种用于输出
DateTimeFormatter inFormat = DateTimeFormatter.ofPattern("dd/M/yyyy");
DateTimeFormatter outFormat = DateTimeFormatter.ofPattern("yyyy/M/dd");
List<String[]> date = new ArrayList<>();
String[] a= {"12/2/2018","a1","a2"};
String[] b= {"13/3/2018","b1","b2"};
String[] c= {"14/4/2018","c1","c2"};
date.add(a);
date.add(b);
date.add(c);
//Since it is String array need lambda expression to update and return
List<String[]> result = date.stream().map(arr->{
arr[0]=LocalDate.parse(arr[0],inFormat).format(outFormat);
return arr;
}).collect(Collectors.toList());
为什么要使用流?
DateTimeFormatter originalFormatter = DateTimeFormatter.ofPattern("d/M/u");
DateTimeFormatter wantedFormatter = DateTimeFormatter.ofPattern("u/M/d");
date.forEach(arr -> {
LocalDate ld = LocalDate.parse(arr[0], originalFormatter);
arr[0] = ld.format(wantedFormatter);
});
检查结果:
date.forEach(arr -> System.out.println(Arrays.toString(arr)));
输出:
[2018/2/12, a1, a2] [2018/3/13, b1, b2] [2018/4/14, c1, c2]
我的代码(以及其他一些答案中的代码)修改了您的原始数组。请决定是否可以。如果是,你不应该真正使用流,因为它们应该没有副作用。如果您确实需要原始数组保持不变,流就可以了(使用与以前相同的格式化程序):
List<String[]> newDateList = date.stream()
.map(arr -> {
LocalDate ld = LocalDate.parse(arr[0], originalFormatter);
String[] newArr = Arrays.copyOf(arr, arr.length);
newArr[0] = ld.format(wantedFormatter);
return newArr;
})
.collect(Collectors.toList());
newDateList.forEach(arr -> System.out.println(Arrays.toString(arr)));
输出与之前相同。