【问题标题】:Is there a way to change dateFormat with java 8 stream?有没有办法用 java 8 流更改日期格式?
【发布时间】:2019-07-30 09:46:13
【问题描述】:

我想用 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"}}

【问题讨论】:

  • 如果没有 Stream API,您将如何更改日期格式?
  • 我的意思是 api 流 java8
  • @ThaeNu 这很清楚,但 Andrew 试图将您推向正确的方向。更明确地说,将列表转换为流,将map 与修改日期的函数一起使用,然后收集回列表。安德鲁评论的重点是中间步骤。
  • date.stream().forEach(x->Arrays.stream(x).map(i -> { return changeDateFormat(i, "dd/mm/yyyy", "yyyy/mm/ dd"); }).forEach(System.out::print));但我在代码中有一些问题

标签: list date java-8 java-stream date-formatting


【解决方案1】:

我希望你的意思是 yyyy/MM/dd 因为 m 代表分钟,M 代表月...

考虑来自流 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 年 2 月 12 日,a1,a2]

[2018/03/13, b1, b2]

[2018/04/14,c1,c2]

【讨论】:

    【解决方案2】:

    如果不迭代所有项目,您将无法做到这一点。

    对于您的简单案例dd/mm/yyyyyyyy/mm/dd,您可以使用这个:

    date.forEach(i -> {
        String[] parts = i[0].split("/");
        i[0] = parts[2] + "/" + parts[1] + "/" + parts[0];
    });
    

    使用 java time 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.time 解决方案。打字更多,但也更有意义,而且不是那么低级。
    【解决方案3】:

    您可以通过使用 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());
    

    【讨论】:

      【解决方案4】:

      为什么要使用流?

          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)));
      

      输出和以前一样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-30
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-22
        相关资源
        最近更新 更多