2 回答
TA贡献1851条经验 获得超5个赞
我宁愿使用LocalDate而不是SimpleDateFormat,因为在那里你可以更轻松地计算差异和许多其他事情。要分割成对出现的日期,您可以使用正则表达式在每隔一个逗号分隔字符串。
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.LongSummaryStatistics;
import java.util.function.Function;
import java.util.regex.Pattern;
public class Test{
public static void main(String[] args){
String formatted
= "2014-04-28 ,2014-04-28 ,"
+ "2015-10-26 ,2015-10-30 ,"
+ "2015-07-30 ,2015-07-30 ,"
+ "2015-04-14 ,2015-04-20 ,"
+ "2013-11-14 ,2013-11-18 ,"
+ "2014-04-16 ,2014-04-22 ,"
+ "2014-11-19 ,2014-11-21 ,"
+ "2019-10-01 ,2019-10-01 ";
//a formater for your date pattern
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
//a function to calculate the date differnce for a given pair of dates of form "2014-04-28 ,2014-04-28"
Function<String,Long> dateDiff = s -> ChronoUnit.DAYS.between(
LocalDate.parse(s.split(",")[0].trim(), dtf),
LocalDate.parse(s.split(",")[1].trim(), dtf));
//split your original string at each second ',' with below regex
LongSummaryStatistics statistics = Pattern.compile("(?<!\\G[\\d -]+),")
.splitAsStream(formatted)
.mapToLong(s -> dateDiff.apply(s))
.summaryStatistics();
System.out.println(statistics);
}
}
统计数据包含总和、计数、最小值、最大值和平均值。如果你只对平均值感兴趣,也可以直接调用
double average = Pattern.compile("(?<!\\G[\\d -]+),")
.splitAsStream(formatted)
.mapToLong(s -> dateDiff.apply(s))
.average().getAsDouble();
TA贡献1799条经验 获得超6个赞
博士
ChronoUnit // An enum delineating granularities of time.
.DAYS // `DAYS` is one of the objects pre-defined on that enum.
.between( // Calculates elapsed time.
LocalDate.parse( "2015-10-26" ) , // `LocalDate` represents a date-only value, without time-of-day, without time zone.
LocalDate.parse( "2015-10-30" ) // `LocalDate` by default parses strings that comply with standard ISO 8601 formats.
) // Returns a `long`, the number of days elapsed. Uses Half-Open approach, where the beginning is *inclusive* while the ending is *exclusive*.
4
错误的班级
该类java.util.Date
代表 UTC 中的某个时刻,而不是日期。此外,那个可怕的类在几年前就被现代的java.time类取代了。
LocalDate
该类LocalDate
表示仅日期值,没有时间、时区或相对于 UTC 的偏移量。
您的输入符合 ISO 8601,因此您可以直接解析。无需定义格式化模式。
LocalDate start = LocalDate.parse( "2015-10-26" ) ;
使用 计算经过的时间Period
。
Period p = Period.of( start , stop ) ;
或者直接询问天数。
long days = ChronoUnit.DAYS.between( start , stop ) ;
添加回答
举报