代码之家  ›  专栏  ›  技术社区  ›  Demetrius

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

  •  0
  • Demetrius  · 技术社区  · 6 年前

    就像标题上说的,给定两个约会的时间

    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
    

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Justin    6 年前

    好吧,您知道日期有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
                }
            }
    
        2
  •  3
  •   Anonymous    6 年前

    Java.时间

        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
    

    我使用JavaTimes,现代Java日期和时间API。我总是推荐它用于Java中的任何日期时间工作。我觉得和他一起工作很愉快。

    我正在过滤 半开 时间间隔。这意味着,将包含一条准确标记为2017-01-31 12:00:00的日志消息,而标记为2017-01-31 15:00:00的消息将不包含在内。这是通常和建议使用的时间间隔。一个优点是,如果过滤到相邻(不重叠)的间隔,则保证每个日志消息仅包含一次。

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

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