Распечатать все метки времени между двумя метками времени - PullRequest
0 голосов
/ 18 января 2019

Как гласит заголовок, учитывая две даты со временем вроде

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 голосов
/ 21 января 2019

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, современныйAPI даты и времени Java.Я всегда рекомендую его для любой даты и времени на Java.Мне так приятно работать.

Я фильтрую интервал полуоткрытый между вашими временами.Это означает, что сообщение журнала с отметкой 2017-01-31 12:00:00 будет включено, а сообщение с отметкой 2017-01-31 15:00:00 не будет включено.Это обычное и рекомендуемое использование временных интервалов.Одним из преимуществ является то, что при фильтрации по смежным (непересекающимся) интервалам каждое сообщение журнала гарантированно будет включено ровно один раз.

Если ваш массив очень большой и всегда сортируется, а производительность имеет значение, вы можете воспользоваться преимуществами использованиябинарный поиск начала и конца нужного интервала.Найдите его, если он уместен, и вы еще не знаете, что это такое.

Ссылка: Учебное пособие по Oracle: Дата и время , объясняющее, как использовать java.time.

0 голосов
/ 18 января 2019

хорошо, вы знаете, что дата имеет длину 20 символов, поэтому вы можете получить строку даты, используя подстроку, а затем проанализировать ее с помощью DateFormat, чтобы проверить, находится ли она между двумя датами. Вы анализируете time1, time2 и свою временную метку на даты, а затем проверяете, находится ли она между этими двумя моментами, как это. 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
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...