我有一个 txt 文件,其中包含如下行:
0 Apr 12 08:42:44.000009 (+0.000009) *** START ***
我想获取的信息是:
Apr 12 08:42:44
我当前使用的方法是使用扫描仪读取此行:
public void getTime() throws IOException {
String time = "";
Scanner scan = new Scanner(location);
String firstLine = scan.nextLine();
String[] splitString = firstLine.split("\\.");
String[] rebootTime = splitString[0].split(" ");
for(int i = 0; i < rebootTime.length; i++) {
if(i != 0) {
time = time + rebootTime[i] + " ";
}
}
System.out.println(time);
}
有没有更智能的方法来获取时间信息?
获得时间后,如何将其转换为日期格式并计算持续时间?
我正在尝试将 JAVA 8 Instant 与 this method 一起使用,如何将时间值转换为Instant类型?
最佳答案
如果我理解正确,您的目标是从日志文件的每个字符串中提取重新启动时间。我认为使用扫描仪是可以的。从日志文件中提取一行后,您还可以对其使用正则表达式,如下所示:
String firstLine = scan.nextLine();
Pattern pattern = Pattern.compile("[a-zA-Z]{3}\\s\\d{2}\\s\\d{2}:\\d{2}:\\d{2}");
Matcher matcher = pattern.matcher(firstLine);
if (matcher.find()) {
String rebootTime = matcher.group();
}
这个正则表达式并不完美,但它可以在您的线路上工作。您可以更加严格或不那么严格。
要将字符串格式化为LocalDateTime,可以使用以下方法:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("MMM dd HH:mm:ss")
.parseDefaulting(ChronoField.YEAR, 1)
.toFormatter();
LocalDateTime date = LocalDateTime.parse(rebootTime, formatter);
因此 parseDefaulting(ChronoField.YEAR, 1)
意味着您忽略字符串中的年份并将其设置为结果 LocalDateTime 中的 1。之后,您可以使用 LocalDateTimes 计算持续时间。
关于Java扫描日志文件并获取时间信息,然后计算耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45467628/