如何在Java中获取连续的星期数和年份?

时间:2019-12-29 15:25:20

标签: java week-number

我正在存储一些以周号为参考的数据。现在,我有两个按钮来请求数据。一个是上周的,另一个是下周的。默认情况下会获取当前周的数据

我刚刚结束了年末的例外情况,因为我得知明年还有第53周( 2020)。现在每隔一周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)));
    }

function: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];
}

2 个答案:

答案 0 :(得分:1)

tl; dr

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

要获取上一周或下一周的信息,只需调用加号或减号方法。

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

答案 1 :(得分:0)

java.time 软件包将使您非常满意:

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

这将返回一年中的星期(执行后现在返回52),但是整个程序包包含您需要的所有内容,您只需进行探索即可。