打印两个时间戳之间的所有时间戳

时间:2019-01-18 18:04:46

标签: java timestamp

就像标题所述,给定两个日期,例如

time1= "2017-01-31 12:00:00" 
time2= "2017-01-31 15:00:00”

我想返回这两个时间和日期之间的数组中的所有时间戳。例如,这就是数组的样子:

2017-01-31 01:33:30 random text log message x

2017-01-31 08:34:30 sdfsd log message y

2017-01-31 11:35:30 sdfsdfsdf log message z

2017-01-31 12:30:30 random text log message x

2017-01-31 13:31:30 sdfsd log message y

2017-01-31 14:32:30 sdfsdfsdf log message z

2017-01-31 16:32:35 sdfsdfsdf log message a

2017-01-31 16:33:30 random text log message x

2017-01-31 16:34:30 sdfsd log message y

2017-01-31 16:35:30 sdfsdfsdf log message z

2017-01-31 16:36:35 sdfsdfsdf log message a

输出:

2017-01-31 12:30:30 random text log message x

2017-01-31 13:31:30 sdfsd log message y

2017-01-31 14:32:30 sdfsdfsdf log message z

我是否必须使用正则表达式存储每个单独的时间/日期戳的时间和日期,然后将它们与数组中的每个时间戳进行比较?还是什么是最佳解决方案?

2 个答案:

答案 0 :(得分:3)

java.time

    DateTimeFormatter logDtf = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");

    String[] logMessages = {
            "2017-01-31 01:33:30 random text log message x",
            "2017-01-31 08:34:30 sdfsd log message y",
            "2017-01-31 11:35:30 sdfsdfsdf log message z",
            "2017-01-31 12:30:30 random text log message x",
            "2017-01-31 13:31:30 sdfsd log message y",
            "2017-01-31 14:32:30 sdfsdfsdf log message z",
            "2017-01-31 16:32:35 sdfsdfsdf log message a",
            "2017-01-31 16:33:30 random text log message x",
            "2017-01-31 16:34:30 sdfsd log message y",
            "2017-01-31 16:35:30 sdfsdfsdf log message z",
            "2017-01-31 16:36:35 sdfsdfsdf log message a"
    };

    String time1 = "2017-01-31 12:00:00";
    String time2 = "2017-01-31 15:00:00";

    LocalDateTime start = LocalDateTime.parse(time1, logDtf);
    LocalDateTime end = LocalDateTime.parse(time2, logDtf);

    Arrays.stream(logMessages)
            .filter(lm -> {
                TemporalAccessor parsedDateTime = logDtf.parse(lm, new ParsePosition(0));
                LocalDateTime logDateTime = LocalDateTime.from(parsedDateTime);
                return ! logDateTime.isBefore(start)
                        && logDateTime.isBefore(end);
            })
            .forEach(System.out::println);

此代码的输出是您要求的:

2017-01-31 12:30:30 random text log message x
2017-01-31 13:31:30 sdfsd log message y
2017-01-31 14:32:30 sdfsdfsdf log message z

我正在使用java.time(现代Java日期和时间API)。对于Java中的任何日期时间工作,我总是建议使用它。我觉得很好用。

我正在过滤您两次之间的半开时间间隔。这意味着,将包括一条恰好标记为2017-01-31 12:00:00的日志消息,而不会包括一条标记为2017-01-31 15:00:00的消息。这是通常的做法,建议使用时间间隔。优点之一是,如果您过滤到相邻(非重叠)的时间间隔,则可以确保每条日志消息被准确地包含一次。

如果数组非常大且始终排序并且性能很重要,则可以通过对所需间隔的开始和结束使用二进制搜索来受益。查找它是否相关,而您还不知道它是什么。

链接: Oracle tutorial: Date Time解释了如何使用java.time

答案 1 :(得分:1)

well, you know the date is 20 characters long, so you can get the date string using substring and then parse it with DateFormat to check if it is between the 2 dates. you parse time1, time2, and the your timestamp into dates, and then check if it is between the two times like this. timestamp.after(time1) && timestamp .before(time2)

    String time1= "2017-01-31 12:00:00" 
        String time2= "2017-01-31 15:00:00”

        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        Date minDate = format.parse(time1);
        Date maxDate = format.parse(time2);

        for(String row : somearray){
            String rowDateString = row.substring(0,19);
            Date rowDate = format.parse(rowDateString);
            if(rowDate.after(minDate) && rowDate .before(maxDate){
                //get this row because it is between dates
            }
        }