【问题标题】:How to get successive week number and year in java?如何在java中获得连续的周数和年份?
【发布时间】:2019-12-29 15:25:20
【问题描述】:

我正在存储一些以周数引用的数据。现在,我有两个按钮来请求数据。一个用于前一周,另一个用于下周。默认情况下会获取本周的数据

我刚刚完成了年底的例外处理,我了解到明年(2020 年)也有第 53 周.现在,每次第 53 周时它都会中断。(它只是跳过第 53 周)

显然,必须有更好的方法来做到这一点.. 我只是不断添加异常,以下是我最终得到的代码。 我是菜鸟,所以请忍受丑陋的逻辑。

LocalDate wks, mon, tue, wed, thu, fri, sat, wke;
try {
    week = Integer.parseInt(request.getParameter("week"));
    year = Integer.parseInt(request.getParameter("year"));
} catch (NumberFormatException e) {
    week = getWeek();
    year = getCurrYear();
    flag = 1;
}
LocalDate date = LocalDate.now()
.withYear(year) // year
.with(WeekFields.ISO.weekOfWeekBasedYear(), week) // week of year
.with(WeekFields.ISO.dayOfWeek(), 7);
wks = date.plusDays(-7);
if ((date + "").substring(0, 4).equals((wks + "").substring(0, 4))) {
} else if (flag == 1) {
    year++;
}
date = LocalDate.now()
.withYear(year) // year
.with(WeekFields.ISO.weekOfWeekBasedYear(), week) // week of year
.with(WeekFields.ISO.dayOfWeek(), 7);
wks = date.plusDays(-7);
mon = wks.plusDays(1);
tue = wks.plusDays(2);
wed = wks.plusDays(3);
thu = wks.plusDays(4);
fri = wks.plusDays(5);
sat = wks.plusDays(6);
wke = date;
System.out.println(week + " " + year);
heading = "<div class='row'>"
        + "<form action=\"";
if (week == 1) {
    heading += "javascript:setContent('/getData?week=52&year=" + (year - 1) + "')\" >";
} else {
    heading += "javascript:setContent('getData?week=" + (week - 1) + "&year=" + (year) + "')\" >";
}
heading += "<button type='submit'>Previous</button></form><form action=\"";
if (week == 52) {
    heading += "javascript:setContent('getData?week=1&year=" + (year + 1) + "')\" >";
} else {
    heading += "javascript:setContent('getData?week=" + (week + 1) + "&year=" + (year) + "')\" >";
}
heading += "<button type='submit'Next</button></form>";
out.print(heading);

函数:getWeek()

public static int getWeek() {
        java.util.Date date = new java.util.Date();
        SimpleDateFormat ft = new SimpleDateFormat("w");
        return (Integer.parseInt(ft.format(date)));
    }

函数:getCurrYear() {

public static int getCurrYear() {
         Date date = new Date();
         return (date.getYear() + 1900);
    }

我必须打印一周中的日期,这就是为什么周一到周六的变量。

我只想要一个像下面这样的函数

function int[] getWeekYear(){
    return [prev week,prev week's year,current week,current year,next week,next week's year];
}

【问题讨论】:

    标签: java week-number


    【解决方案1】:

    tl;博士

    YearWeek
    .now( 
        ZoneId.of( "Asia/Tokyo" ) 
    )
    .minusWeeks( 1 ) 
    .getWeek()         // Returns an `int` in range of 1-52 or 1-53, the week number within a year. 
    

    详情

    永远不要使用两个Date 类中的任何一个。它们很糟糕,现在是遗产。几年前,它们被 JSR 310 中定义的现代 java.time 类所取代。

    Answer by Renato 是正确的。

    YearWeek

    此外,如果您对一周的定义是标准 ISO 8601 定义(一周从星期一开始,第 1 周包含日历年的第一个星期四),则将 ThreeTen-Extra 库添加到您的项目中。该库具有扩展java.time 功能的类。特别是,您将获得 YearWeek 类。

    获取当前周。这需要一个时区。对于任何给定的时刻,日期都会因时区而在全球范围内变化。

    ZoneId z = ZoneId.of( "Africa/Tunis" );
    YearWeek currentWeek = YearWeek.now( z ) ;
    

    要获得前一周或下一周的数据,只需调用 plus 或 minus 方法。

    YearWeek priorWeek = currentWeek.minusWeeks( 1 ) ;
    YearWeek followingWeek = currentWeek.plusWeeks( 1 ) ;
    

    如果您想要一周中的日期,请致电 atDay 并从 DayOfWeek 枚举中传递一周中的一天。

    LocalDate localDate = priorWeek.atDay( DayOfWeek.MONDAY ) ;
    

    您可以查询周数及其年份(即基于周的年份)。

    int weekNumber = priorWeek.getWeek() ;
    int weekBasedYearNumber = priorWeek.getYear() ; 
    

    【讨论】:

      【解决方案2】:

      java.time会给你很大的满足感:

      LocalDate.now().get(WeekFields.ISO.weekOfWeekBasedYear())
      

      这将返回一年中的第几周(现在执行返回 52),但整个包包含您需要的所有内容,您只需探索即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        相关资源
        最近更新 更多