Java LocalTime方法返回没有意义的整数
我有一个我应该编写的函数,它返回一个Java LocalTime方法返回没有意义的整数,java,java-8,java-time,Java,Java 8,Java Time,我有一个我应该编写的函数,它返回一个集合。它有3个参数:LocalTime startDate,LocalTime endDate,和收集日志行。我应该编写函数体,以便它成功地从日志中查找并删除未在startDate和endDate定义的特定时间范围内的任何行,然后返回该日志 计划是使用LocalTime方法getHour(),getMinute()和getSecond(),从endDate和startDate获取小时、分钟和秒数,并转换为秒,以查看在时间段开始时经过了多少秒,以及在时间段结束时
集合
。它有3个参数:LocalTime startDate
,LocalTime endDate
,和收集日志行
。我应该编写函数体,以便它成功地从日志中查找并删除未在startDate
和endDate
定义的特定时间范围内的任何行,然后返回该日志
计划是使用LocalTime
方法getHour()
,getMinute()
和getSecond()
,从endDate
和startDate
获取小时、分钟和秒数,并转换为秒,以查看在时间段开始时经过了多少秒,以及在时间段结束时经过了多少秒。然后迭代日志行中的所有字符串。它们的格式为:2012-05-11T02:11:44Z此程序成功执行了此操作。
。我拆分每个字符串以获取行的第一部分,并使用ISO\u DATE\u TIME
格式中的LocalTime.parse()
对其进行解析,以获取日期并将其存储在LocalTime logDate
中。最后,我使用上面列出的相同的LocalTime
方法来获取截至此日志时间的总秒数
我遇到的问题是,当我使用LocalTime
方法时,无论startDate
、endDate
或logDate
是什么,它都会一遍又一遍地存储所有相同的数字。在此之前,我从未使用过Java8或任何Java库,因此我想不出它为什么或如何这样做。我知道,当传递startDate
和endDate
时,它们也是字符串,格式与使用LocalDate.parse()
和ISO\u date\u TIME
格式解析的日志日期相同
public Collection<String> search(Collection<String> logLines, LocalTime startDate, LocalTime endDate) {
// format date extracted from logLines to same format as startDate and endDate
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;
// total seconds elapsed at startDate
// total seconds elapsed by endDate
int startSeconds = startDate.getHour() * 60 * 60;
startSeconds += startDate.getMinute() * 60;
startSeconds += startDate.getSecond();
int endSeconds = endDate.getHour() * 60 * 60;
endSeconds += endDate.getMinute() * 60;
endSeconds += endDate.getSecond();
// iterate through logLines
int i = 0;
for(String logLine : logLines) {
// array of strings to separate logLine into parts
String[] line = new String[2];
line = logLine.split("\t");
// localTime object to store extracted date from logLines
LocalTime logDate = LocalTime.parse(line[0], formatter);
// get seconds elapsed from logDate
int logDateSeconds = logDate.getHour() * 60 * 60;
logDateSeconds += logDate.getMinute() * 60;
logDateSeconds += logDate.getSecond();
// print amount of seconds to console
System.out.print(logDateSeconds);
System.out.print(" ");
System.out.print(startSeconds);
System.out.print(" ");
System.out.print(endSeconds);
System.out.print("\n");
if (logDateSeconds > endSeconds || logDateSeconds < startSeconds) {
logLines.remove(i);
i--;
}
i++;
}
return logLines;
}
不管输入是什么
请给我指一下正确的方向
样本输入:
日志行
包含
2012-05-11T02:11:44Z This program did this operation successfully.
2012-05-11T02:12:52Z This program did this operation successfully.
2012-05-11T02:14:17Z This program did this operation successfully.
2012-05-11T02:18:02Z This program did this operation successfully.
2012-05-11T02:20:30Z This program did this operation successfully.
startDate=02:11:44
和endDate=02:19:57
我最初的问题的答案是我使用for(String logLine:logLines)
在日志行上迭代的方式。我将其更改为(迭代器logLine=logLines.Iterator();logLine.hasNext();)
。这要感谢关于我如何使用日志行的介绍。删除(I)。在得出这个结论之前,我注意到日志行中的日期是瞬间,我尝试使用DateTimeFormatter.ISO_INSTANT
,但是LocalTime
无法解析时间,这是有意义的。我还尝试创建LocalDateTime
、ZonedDateTime
和Instant
对象,但它们都返回了错误找不到符号
。我不知道这到底是为什么,因为这是我第一次使用Java8和Java。我可以使用的唯一类是java.time.LocalTime
和java.time.DateTimeFormatter
。该Instant
与LocalTime
和ZonedLocalTime
在同一个包中,我认为这两个类是相同的,但显然在这个项目中我无法访问这些类。我还尝试使用了isBefore()
、isAfter()
和equals()
,但它们的功能并没有达到我的预期,我认为如果我可以计算所经过的秒数,就没有必要了
然后我遇到了另一个问题,在线程“main”java.time.format中出现了异常。这很有趣,因为我看不到测试用例的输入或输出,也不知道异常是什么。我认为问题在于logLine.next()
没有包含日期或时间。为了解决这个问题,我摸索了try
和catch
块,试图使用DateTimeParseException
,但没有成功。我得到了与以前相同的找不到符号错误。然后我意识到一定有一个泛型的异常
类,它解决了这个问题。一切正常
下面是更正后的代码,它更小,更易于阅读:
public Collection<String> search(Collection<String> logLines, LocalTime startDate, LocalTime endDate) {
// DateTimeFormatter same as startDate and endDate
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;
// total seconds elapsed at startDate
// total seconds elapsed at endDate
int startSeconds = startDate.toSecondOfDay();
int endSeconds = endDate.toSecondOfDay();
// iterate through logLines
for(Iterator<String> logLine = logLines.iterator(); logLine.hasNext(); ) {
// split logLine into two strings: logDate, logDescription
// store in string array `line`
String[] line = logLine.next().split("\t");
// int for storing amount of seconds from logDate
int logDateSeconds;
// try to parse logDate
// catch generic exception to avoid parsing error
try {
// parse logDate using ISO_DATE_TIME formatter
// get amount of seconds to compare to startSeconds and endSeconds
logDateSeconds = LocalTime.parse(line[0], formatter).toSecondOfDay();
} catch (Exception e) {
// continue to next iteration for any Exception
continue;
}
// compare amount of seconds to see if it is within time frame
if (logDateSeconds >= endSeconds || logDateSeconds < startSeconds) {
// remove iteration if it is not within time frame
logLine.remove();
}
}
// return edited
return logLines;
}
公共集合搜索(集合日志行、LocalTime开始日期、LocalTime结束日期){
//DateTimeFormatter与startDate和endDate相同
DateTimeFormatter formatter=DateTimeFormatter.ISO_DATE_TIME;
//开始时经过的总秒数
//endDate时经过的总秒数
int startSeconds=startDate.toSecondOfDay();
int endSeconds=endDate.toSecondOfDay();
//遍历日志行
for(迭代器logLine=logLines.Iterator();logLine.hasNext();){
//将logLine拆分为两个字符串:logDate、logDescription
//存储在字符串数组`行中`
String[]line=logLine.next().split(“\t”);
//int用于存储从logDate开始的秒数
int logdates;
//尝试解析logDate
//捕获泛型异常以避免分析错误
试一试{
//使用ISO_日期_时间格式化程序解析日志日期
//获取要与开始秒和结束秒进行比较的秒数
logDateSeconds=LocalTime.parse(第[0]行,格式化程序).toSecondOfDay();
}捕获(例外e){
//对于任何异常,请继续下一次迭代
继续;
}
//比较秒数,查看它是否在时间范围内
如果(logDateSeconds>=endSeconds | | logDateSeconds
您无缘无故地创建了一个新阵列。只需执行String[]line=logLine.split(“\t”)因此,startSeconds
和endSeconds
不会更改,因此
public Collection<String> search(Collection<String> logLines, LocalTime startDate, LocalTime endDate) {
// DateTimeFormatter same as startDate and endDate
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;
// total seconds elapsed at startDate
// total seconds elapsed at endDate
int startSeconds = startDate.toSecondOfDay();
int endSeconds = endDate.toSecondOfDay();
// iterate through logLines
for(Iterator<String> logLine = logLines.iterator(); logLine.hasNext(); ) {
// split logLine into two strings: logDate, logDescription
// store in string array `line`
String[] line = logLine.next().split("\t");
// int for storing amount of seconds from logDate
int logDateSeconds;
// try to parse logDate
// catch generic exception to avoid parsing error
try {
// parse logDate using ISO_DATE_TIME formatter
// get amount of seconds to compare to startSeconds and endSeconds
logDateSeconds = LocalTime.parse(line[0], formatter).toSecondOfDay();
} catch (Exception e) {
// continue to next iteration for any Exception
continue;
}
// compare amount of seconds to see if it is within time frame
if (logDateSeconds >= endSeconds || logDateSeconds < startSeconds) {
// remove iteration if it is not within time frame
logLine.remove();
}
}
// return edited
return logLines;
}