亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JAVA:如何計算多個字符串日期的平均天數?

JAVA:如何計算多個字符串日期的平均天數?

PIPIONE 2023-10-12 16:46:11
我編寫了一個程序,它總是計算兩個日期之間的天數差異。我現在想總結所有差異天數,并將其除以計數,以便得到平均天數。有人能幫我嗎?有沒有辦法甚至避免 for 循環。import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class AVGDateCalculation {    public static void main (String [] args) throws ParseException{    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 ";                String[] parts = formatted.split(",");                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");                int count = 0;                int a;                long difference = 0L;                float daysBetween = 0.00f;                float averageDays = 0.00f;                Date dateBefore = null;                Date dateAfter = null;                for (a = 0; a<parts.length; a+=1) {                    dateBefore = sdf.parse(parts[a++]);                    count++;                    dateAfter = sdf.parse(parts[a+=0]);                    difference = dateAfter.getTime() - dateBefore.getTime();                    daysBetween = (difference / (1000*60*60*24));                        averageDays = (count / daysBetween);                    System.out.println(String.valueOf(dateAfter) + " - " + `String.valueOf(dateBefore));`                    System.out.println(String.valueOf(dateAfter.getTime()) + " - " + String.valueOf(dateBefore.getTime()));                    System.out.println(String.valueOf(daysBetween));                    System.out.println(String.valueOf(averageDays) + " days");                    System.out.println(String.valueOf(count));                }    }}
查看完整描述

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(); 


查看完整回答
反對 回復 2023-10-12
?
哈士奇WWW

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類取代了。

https://img1.sycdn.imooc.com/6527b29d0001962006560410.jpg

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?)?;


查看完整回答
反對 回復 2023-10-12
  • 2 回答
  • 0 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號