ISO 周计算 记录

java不太熟悉但.需要java版的.一开始写的是javascript.此处只记录个思路

 1 import java.time.LocalDate;
 2 import java.time.temporal.ChronoUnit;
 3 import java.time.temporal.WeekFields; 
 4 
 5 public class tmain {
 6     public static void main(String[] args) {
 7 
 8        getTest();
 9     }
10   static WeekFields weekFields = WeekFields.ISO;
11 
12    private static void getTest() {
13 
14       class WeekOfYearModel {
15 
16         public int baseYear;
17         public int weekNum;
18 
19         public WeekOfYearModel(int byear, int wkn) {
20           this.baseYear = byear;
21           this.weekNum = wkn;
22         }
23 
24         public long subtract(WeekOfYearModel wk) {
25           long re ;
26           if (this.baseYear == wk.baseYear) {
27             re = this.weekNum - wk.weekNum;
28           } else {
29             long max ,min;
30             LocalDate sDate, eDate;
31             int xs = 1;
32             if (this.baseYear > wk.baseYear) {
33               sDate = getFirstDayOfFirstWeekByYear(wk.baseYear);
34               eDate = getFirstDayOfFirstWeekByYear(wk.baseYear + 1).plusDays(-1);
35               max = this.weekNum;
36               min=wk.weekNum;
37             } else {
38               sDate = getFirstDayOfFirstWeekByYear(this.baseYear);
39               eDate = getFirstDayOfFirstWeekByYear(this.baseYear + 1).plusDays(-1);
40               max = wk.weekNum;
41               min=this.weekNum;
42               xs = -1;
43             }
44            // max +=Math.ceilDiv(ChronoUnit.DAYS.between(sDate, eDate), 7) ;
45            max +=(ChronoUnit.DAYS.between(sDate, eDate)+7-1)/7 ; 
46            re = (max - min) * xs;
47           }
48           return re;
49         }
50 
51       }
52   
53       WeekOfYearModel sdate=new WeekOfYearModel(2025,2);
54       WeekOfYearModel edate = new WeekOfYearModel(2024, 52);
55       //计算两周相差周数
56       long d= sdate.subtract(edate);
57       System.out.print(d);
58     }
59     public static LocalDate getFirstDayOfFirstWeekByYear(int year) {
60         int cYear = year;
61         LocalDate theWeekFirstDayOfCurrentYear;
62         LocalDate firstDayOfYear = LocalDate.of(cYear, 1, 1) ;
63         int weekDayOffirstDay = firstDayOfYear.get(weekFields.dayOfWeek());
64         if (weekDayOffirstDay > 4) {          
65             //1号是去年最后一周下周一是今年第一周的第一天
66             theWeekFirstDayOfCurrentYear = firstDayOfYear.plusDays((7 - weekDayOffirstDay) + 1);
67         } else if (weekDayOffirstDay > 1) {
68             theWeekFirstDayOfCurrentYear =firstDayOfYear.plusDays((weekDayOffirstDay-1)*-1);
69         } else {
70             theWeekFirstDayOfCurrentYear = firstDayOfYear;
71         }
72         return theWeekFirstDayOfCurrentYear;
73     }
74     public static int getWeekOfYear(LocalDate data) {      
75       return data.get(weekFields.weekOfWeekBasedYear());
76     }
77 }

 

 

javascript

 

    function getWeekNumOfYear_SE(year) {
        let cdate = new Date(year+" 00:00:00");
        let cYear = cdate.getFullYear();
        let theFirstWeekFirstDayOfCurrentYear = getFirstDayOfFirstWeekByYear(cYear);
        let theFirstWeekFirstDayOfNextYear = getFirstDayOfFirstWeekByYear(cYear + 1);
        let theEndWeekLastDayOfCurrentYear = new Date(theFirstWeekFirstDayOfNextYear.getFullYear(), theFirstWeekFirstDayOfNextYear.getMonth(), theFirstWeekFirstDayOfNextYear.getDate() - 1)
        const dayms = (1000 * 60 * 60 * 24);
        if (cdate >= theFirstWeekFirstDayOfCurrentYear && cdate <= theEndWeekLastDayOfCurrentYear) {
            let ccday = (cdate-theFirstWeekFirstDayOfCurrentYear) / dayms+1;
            return { year: cYear, weekNum: Math.ceil(ccday / 7) }
        } else if (cdate < theFirstWeekFirstDayOfCurrentYear) {
            let preYear = cYear - 1;
            let ccday = (cdate - getFirstDayOfFirstWeekByYear(preYear)) / dayms+1;
            return { year: preYear, weekNum: Math.ceil(ccday / 7) };
        } else {
            return { year: cYear + 1, weekNum: 1 };
        }

    }


    function getFirstDayOfFirstWeekByYear(year) {
        let cYear = year;
        let firstDayOfYear = theWeekFirstDayOfCurrentYear = new Date(cYear, 0, 1);
        let weekDayOffirstDay = firstDayOfYear.getDay() || 7;
        if (weekDayOffirstDay > 4) {          
            //1号是去年最后一周下周一是今年第一周的第一天
            theWeekFirstDayOfCurrentYear = new Date(cYear, 0, firstDayOfYear.getDate() + (7 - weekDayOffirstDay) + 1);
        } else if (weekDayOffirstDay > 1) {
            theWeekFirstDayOfCurrentYear = new Date(cYear, 0, 1 - (weekDayOffirstDay-1));
        } else {
            theWeekFirstDayOfCurrentYear = firstDayOfYear;
        }
        return theWeekFirstDayOfCurrentYear;
    }

 

posted @ 2025-09-29 15:00  望着天的蜗牛  阅读(7)  评论(0)    收藏  举报