Java 如何从文件打印日期范围之间的日期
我试图打印出两个日期范围之间的日志条目,但在打印时遇到了一些问题 我已经从文件中读取了条目,并将获得的信息存储为日期变量,但我仍然能够找出为什么它不能显示范围内的日期 这是文件Java 如何从文件打印日期范围之间的日期,java,date,Java,Date,我试图打印出两个日期范围之间的日志条目,但在打印时遇到了一些问题 我已经从文件中读取了条目,并将获得的信息存储为日期变量,但我仍然能够找出为什么它不能显示范围内的日期 这是文件 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' 201
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);
}
}
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.text.ParseException;
导入java.text.simpleDataFormat;
导入java.util.ArrayList;
导入java.util.Date;
导入java.util.Locale;
导入java.util.Scanner;
公共类读日志{
私有静态字符串行,logLevel=“16:05:31”,businessID=“1329”,sessionID=“34523”,
startDateStr=“2012-09-10”,endDateStr=“2012-09-14”;
私有静态字符串logString=“”;
私有静态ArrayList logList=new ArrayList();
公共静态void main(字符串参数[]){
readFile();
returnLogLinesByLevel();
returnLogLinesByBusiness();
returnLogLinesBySessionID();
returnLogLinesByDate();
}//闭式干管
/*
*此方法检查日志中日期范围之间的条目。
*@param String dateToValidate-这是搜索日志的日期
*@param String startDate-这是开始日期点
*@param String endDate-这是结束日期点
* */
私有静态void returnLogLinesByDate(){
System.out.println(“///By Date///”;
对于(int i=0;i检查范围的条件不正确,应为:
if(date.after(startDate) && date.before(endDate)){
// valid date
}
如果日期小于startDate或大于endDate(与所需日期相反),则先前的条件将返回true。在方法中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
}
如果使用逻辑或(|
)日期总是在开始日期之后或结束日期之前,在这种情况下,方法,isThisDateWithinRange
将始终返回true。我将要验证的日期传递为检查两个日期之间的日期,因此它始终返回true,并因此打印出每个日志条目。我需要做的是传递da当前日志条目的te
if(isThisDateWithinRange(logString.substring(0, 11)))
你所说的范围是什么意思?你能给出一个你希望看到的输出的例子吗?我希望看到下面的2012-09-13 16:04:22调试SID:34523 BID:1329 RID:65d33“启动新会话”2012-09-13 16:04:30调试SID:34523 BID:1329 RID:54f22“验证用户”2012-09-13 16:05:30调试SID:42111 BID:319 RID:65a23“启动新会话”2012-09-13 16:04:50错误SID:34523出价:1329 RID:54ff3“缺少身份验证令牌”2012-09-13 16:05:31调试SID:42111出价:319 RID:86472“身份验证用户”2012-09-13 16:05:31调试SID:42111出价:319 RID:7a323“删除ID为543234的资产”2012-09-13 16:05:32警告SID:42111出价:319 RID:7a323“投资ID”@mehmetgüngör@CoffeeTime什么这和你的区别是什么?嗨,它仍然不起作用。文件的所有内容都被输出了@Kakarot@CoffeeTime从您在问题中提供的数据来看,似乎所有日期都在这个范围内。我无法修改数据,因此如何仅筛选2012-09-13上的日志条目如果(date.getTime()==startDate.getTime()){}在这个startDate=“2012-09-13”中,您在哪里设置dateToValidate变量,我在代码中看不到