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

Java 使用正则表达式提取和重新格式化时间戳是唯一的方法吗?,java,regex,date,datetime,timestamp,Java,Regex,Date,Datetime,Timestamp,我需要阅读时间戳列表,并按“最早的”和“最新的”顺序进行排序。但在对它们进行排序之前,我需要先重新格式化它们。这些时间戳的格式如下: mm:hh PM/AM dd月(如6月)yyyy 例如: 2016年6月1日下午3:40 2016年6月11日上午11:40 我正在使用正则表达式提取每个时间戳并将其重新格式化为Java可以识别的格式,例如,dd-Month(例如Jun)yyy-hh:mm 我所做的工作如下: package regularExpressionDate; import jav

我需要阅读时间戳列表,并按“最早的”“最新的”顺序进行排序。但在对它们进行排序之前,我需要先重新格式化它们。这些时间戳的格式如下:

mm:hh PM/AM dd月(如6月)yyyy

例如:

  • 2016年6月1日下午3:40
  • 2016年6月11日上午11:40
我正在使用正则表达式提取每个时间戳并将其重新格式化为Java可以识别的格式,例如,dd-Month(例如Jun)yyy-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");
        }
    }
}
对于2016年6月1日下午3:40的输入,我得到了2016年6月1日下午15:40的输入

我的问题是:

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

我使用解析器走了这条路

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

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

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

之后,您可以使用comparator对日期对象进行排序。

您可以使用流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);

您可以这样做:

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

查看工作示例

    // 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));
    }
//要排序的日期
字符串日期[]={“2016年6月1日下午3:40”,“2016年6月11日上午11:40”};
List lst=new ArrayList();
//你的日期格式
DateFormat格式=新的SimpleDataFormat(“hh:mm a dd MMM yyyy”);
用于(字符串str:dates){
//创建转换为java日期的日期集合
lst.add(format.parse(str));
}
//排序日期
集合。排序(lst);
//将日期转换为新格式(如果需要)
DateFormat newFormat=新的简化格式(“dd-MMM-yyy-HH:mm”);
适用于(日期:lst){
System.out.println(newFormat.format(date));
}

请看一下?@RC.,谢谢。解析后,您可以将日期排序为数字。你不必把它们按字符串排序。@PeterLawrey,谢谢,把你的建议写下来。投票赞成教我如何过滤所有空格字符。谢谢,这是一个简单的方法,但是对于更复杂的方法,你应该去掉标签和其他看起来像空白的字符。谢谢。投票通过。这将是我问题的答案。很高兴这对您有所帮助,祝您编码愉快:)@YuZhang from Java 6+您想使用新的JSR-310 API解析和处理日期时间吗
    // 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));
    }