使用正则表达式提取和重新格式化时间戳是唯一的方法



我需要读取时间戳列表并按"最旧""最新"顺序对它们进行排序。但在对它们进行排序之前,我需要先重新格式化它们。这些时间戳采用以下格式:

月:hh 下午/上午 dd 月份(例如 6 月) yyyy,

例如:

  • 下午3:40 2016年6月1日
  • 上午11:40 2016年6月11日

我正在使用正则表达式将每个时间戳提取并重新格式化为 Java 可以识别的格式,例如 dd Month(例如 Jun) yyyy hh:mm

我所做的如下:

package regularExpressionDate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regularExpressionDate {
    public static void main(String[] args) {
        String pattern = "^(\d{1,2}):(\d{1,2})\s(PM|AM)\s(\d{1,2})\s(\w{3})\s(\d{4})$";
        String date1 = "3:40 PM 1 Jun 2016";
        String newDate1;
        int hour;
        Pattern r = Pattern.compile(pattern);
        Matcher m1 = r.matcher(date1);
        if(m1.find()) {
            hour = Integer.parseInt(m1.group(1));
            if(m1.group(3).equals("PM")) {
                hour+=12;
                System.out.println(m1.group(3));
            }
            newDate1 = (m1.group(4) + " " + m1.group(5) + " " + m1.group(6) + " " + hour + ":" + m1.group(2));
            System.out.println(newDate1);
        }
        else {
            System.out.println("No match");
        }
    }
}

对于输入3:40 PM 1 Jun 2016,我得到了1 Jun 2016 15:40

我的问题是:

  • 就清晰度和效率而言,我的方法是否是实现目标的最佳方式?我希望有一种方法可以立即转换为 Java 识别的时间戳格式,但我没有找到它。

可以使用流 API 对多个日期进行分析和排序

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("h:mm a d MMM yyyy");
List<LocalDateTime> dates =
        Stream.of("3:40 PM 1 Jun 2016", "11:40 AM 11 Jun 2016")
                .map(text -> LocalDateTime.parse(text, formatter))
                .sorted()
                .collect(Collectors.toList());
System.out.println(dates);

指纹

[2016-06-01T15:40, 2016-06-11T11:40]

您可以使用 SimpleDateFormat 将日期字符串解析为 Java Date

    String date = "3:40 PM 1 Jun 2016";
    SimpleDateFormat formatter = new SimpleDateFormat("hh:mm a dd MMM yyyy");
    Date startDate = formatter.parse(date);
    System.out.println(startDate);

在此之后,您可以使用比较器对日期对象进行排序。

我使用解析器是这样走的。

    LocalDateTime ldt = LocalDateTime.parse("11:40 AM 11 Jun 2016", DateTimeFormatter.ofPattern("h:m a d MMM yyyy"));
    System.out.println(ldt);

如果有多个空格,可以在解析之前清除输入

 String inputDate = "11:40    AM    11   Jun 2016";
 inputDate = inputDate.replaceAll("[ ]+", " ");

对于多个日期,请移动格式化程序。

 //BTW, it is thread-safe.
 private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("h:m a d MMM yyyy");

 //---
 LocalDateTime ldt = LocalDateTime.parse(input, FORMATTER);

你可以做这样的事情:

将字符串日期转换为Date,然后将它们添加到列表(集合)并对它们进行排序。

在这里查看工作示例!!

    // Your dates to sort
    String dates[] = {"3:40 PM 1 Jun 2016", "11:40 AM 11 Jun 2016"}; 
    List<Date> lst = new ArrayList<>();
    // Your date format
    DateFormat format = new SimpleDateFormat("hh:mm a dd MMM yyyy"); 
    for(String str : dates){
        //creating the collection of your dates converted to java dates
        lst.add(format.parse(str)); 
    }
    //sorting  the dates
    Collections.sort(lst);
    //converting the dates into new format (if required)
    DateFormat newFormat = new SimpleDateFormat("dd MMM yyyy HH:mm");
    for(Date date : lst){
        System.out.println(newFormat.format(date));
    }

相关内容

  • 没有找到相关文章

最新更新