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;

}