【问题标题】:How to print dates between date ranges from file如何从文件中打印日期范围之间的日期
【发布时间】:2018-08-31 06:17:04
【问题描述】:

我正在尝试打印两个日期范围之间的日志条目,但这样做时遇到了一些麻烦。

我已经从文件中读取了条目并存储了我想要的信息作为日期变量,但我仍然可以弄清楚为什么它不会显示范围内的日期

这是文件

 2012-09-13 16:04:22 DEBUG SID:34523 BID:1329 RID:65d33 'Starting new session'
 2012-09-13 16:04:30 DEBUG SID:34523 BID:1329 RID:54f22 'Authenticating User'
 2012-09-13 16:05:30 DEBUG SID:42111 BID:319 RID:65a23 'Starting new session'
 2012-09-13 16:04:50 ERROR SID:34523 BID:1329 RID:54ff3 'Missing Authentication token'
 2012-09-13 16:05:31 DEBUG SID:42111 BID:319 RID:86472 'Authenticating User'
 2012-09-13 16:05:31 DEBUG SID:42111 BID:319 RID:7a323 'Deleting asset with ID 543234'
 2012-09-13 16:05:32 WARN SID:42111 BID:319 RID:7a323 'Invalid asset ID'
 2012-09-14 16:04:22 DEBUG SID:34523 BID:1329 RID:65d33 'Starting new session'
 2012-09-14 16:04:30 DEBUG SID:34523 BID:1329 RID:54f22 'Authenticating User'
 2012-09-14 16:05:30 DEBUG SID:42111 BID:319 RID:65a23 'Starting new session'
 2012-09-14 16:04:50 ERROR SID:34523 BID:1329 RID:54ff3 'Missing Authentication token'
 2012-09-14 16:05:31 DEBUG SID:42111 BID:319 RID:86472 'Authenticating User'
 2012-09-14 16:05:31 DEBUG SID:42111 BID:319 RID:7a323 'Deleting asset with ID 543234'
 2012-09-14 16:05:32 WARN SID:42111 BID:319 RID:7a323 'Invalid asset ID'

这是我的代码

import java.io.File;
import java.io.FileNotFoundException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import java.util.Scanner;

public class ReadLogs {
private static String line, logLevel = "16:05:31", businessID ="1329", sessionID ="34523",
        startDateStr = "2012-09-10",endDateStr ="2012-09-14" ;
private static String logString ="";
private static ArrayList<String> logList = new ArrayList<>();

public static void main(String args[]){
    readFile();
    returnLogLinesByLevel();
    returnLogLinesByBusiness();
    returnLogLinesBySessionID();
    returnLogLinesByDate();
}//close main

/*
 * This method checks the logs for entries between a date range. 
 * @param String dateToValidate - This is the date to search the logs for
 * @param String startDate - This is the starting date point
 * @param String endDate - This is the end date point
 * */
private static void returnLogLinesByDate() {
    System.out.println("///////By Date/////////////////");
   for( int i = 0; i <= logList.size() - 1; i++)
      {
           logString = logList.get(i);
          if(isThisDateWithinRange(logString.substring(0, 11))){
              System.out.println(logString);
          }
      }
   System.out.println("/////////////////////////////////");
}

/*
 * This method checks the logs for entries by the Session ID
 * @param String sessionID - this is the session ID to search for
 * */
private static void returnLogLinesBySessionID() {
    System.out.println("///////By Session ID//////////////");
    checkLogs(sessionID);
    System.out.println("//////////////////////////////////");
}
/*
 * This method checks the logs for entries by the business ID 
 * @param String businessID - this is the business ID to search for
 * */
private static void returnLogLinesByBusiness() {
    System.out.println("///////By Business ID/////////////");
    checkLogs(businessID);
    System.out.println("//////////////////////////////////");
}
/*
 * This method checks the logs for entries by the log level
 * @param String logLevel - this is the log level to search for
 * */
private static void returnLogLinesByLevel() {
    System.out.println("///////By Level/////////////");
    checkLogs(logLevel);
    System.out.println("////////////////////////////");     
   }

/* 
 * This method checks if the logs contain a string of characters
 * @param String logContentToSearchFor - The String to search logs for
 * */
private static void checkLogs(String logContentToSearchFor){
    for( int i = 0; i <= logList.size() - 1; i++)
    {
        logString = logList.get(i);
        if(logString.contains(logContentToSearchFor)){System.out.println(logString);}   
    }
}

/* 
 * This method checks whether the 'dateToValidate' is inside the specified start/end dates
 * and returns true/false based on the outcome
 * */
public static boolean isThisDateWithinRange(String string){
    try
    {

        Date date = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse(string);
        Date startDate =  new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse(startDateStr);
        Date endDate =  new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse(endDateStr);
        if(date.after(startDate) &&  date.before(endDate)){
            return true;
        } else{
            return false;
        }
    }catch(ParseException e) {e.printStackTrace();
            return false;
        }
}

private static void readFile() {
    /*Read log file*/
    Scanner logScanner = null;
    try {
        logScanner = new Scanner(new File("C:\\Users\\"+System.getProperty("user.name")+"\\Desktop\\logs.txt"));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    while (logScanner.hasNextLine()) {
        line = logScanner.nextLine();
        logList.add(line);                  
    }   
}

}

【问题讨论】:

  • 范围是什么意思?您能举一个您希望看到的输出示例吗?
  • id 预计会看到以下内容 2012-09-13 16:04:22 DEBUG SID:34523 BID:1329 RID:65d33 'Starting new session' 2012-09-13 16:04:30 DEBUG SID:34523 BID:1329 RID:54f22 '验证用户' 2012-09-13 16:05:30 DEBUG SID:42111 BID:319 RID:65a23 '开始新会话' 2012-09-13 16:04:50 错误 SID :34523 BID:1329 RID:54ff3 '缺少身份验证令牌' 2012-09-13 16:05:31 DEBUG SID:42111 BID:319 RID:86472 '身份验证用户' 2012-09-13 16:05:31 DEBUG SID: 42111 BID:319 RID:7a323 '删除 ID 为 543234 的资产' 2012-09-13 16:05:32 WARN SID:42111 BID:319 RID:7a323 'Inv ID'@MehmetSedatGüngör
  • @CoffeeTime 这个和你的other question有什么区别?

标签: java date


【解决方案1】:

检查范围的条件不正确,应该是:

  if(date.after(startDate) &&  date.before(endDate)){
      // valid date
  }

如果日期小于 startDate 或大于 endDate(这与您想要的相反),您之前的条件将返回 true。

【讨论】:

  • 嗨,它仍然不起作用。输出文件的所有内容。 @卡卡罗特
  • @CoffeeTime 从您在问题中提供的数据看来,所有日期都在这个范围内
  • 我无法修改数据,所以我将如何过滤仅 2012-09-13 的日志条目
  • 试试这个 if(date.getTime() == startDate.getTime()) {} in this startDate = "2012-09-13"
  • 你在哪里设置 dateToValidate 变量,我在代码中看不到
【解决方案2】:

我将要验证的日期作为在两个日期之间检查的日期传递,因此它始终返回 true,因此打印出每个日志条目。我需要做的是传递当前日志条目的日期。

if(isThisDateWithinRange(logString.substring(0, 11)))

【讨论】:

    【解决方案3】:

    在您的方法isThisDateWithinRange() 中,您要检查的是两个日期之间的日期,使用从未更改过的变量dateToValidate(对于每个方法调用,它的值都是“2012-09-13”)。您应该更改方法签名并传递要检查的参数日期是否在范围内。应该是这样的:

    public static boolean isThisDateWithinRange(String strDate){
      // ....
      Date date = sdf.parse(strDate);
      // ...
    }
    

    正如@Kakarot 回答的那样,您应该使用:

     if(date.after(startDate) &&  date.before(endDate)){
          // valid date
      }
    

    如果您使用逻辑 OR (||) 日期总是在开始日期之后 OR 在结束日期之前,在这种情况下,isThisDateWithinRange 将始终返回 true。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 2022-11-02
      • 2016-11-29
      • 1970-01-01
      相关资源
      最近更新 更多