就像标题所述,给定两个日期,例如
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
我是否必须使用正则表达式存储每个单独的时间/日期戳的时间和日期,然后将它们与数组中的每个时间戳进行比较?还是什么是最佳解决方案?
答案 0 :(得分:3)
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
}
}