如何在Java中获取给定周数的第一天
让我解释一下。通过了解日期的周数和年份:如何在Java中获取给定周数的第一天,java,calendar,dayofweek,Java,Calendar,Dayofweek,让我解释一下。通过了解日期的周数和年份: Date curr = new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(curr); int nweek = cal.WEEK_OF_YEAR; int year = cal.YEAR; 但是现在我不知道怎么知道那周的第一天。我一直在寻找日历,日期,日期格式,但没有什么可能是有用的 有什么建议吗?(使用Java)这些字段不返回值。这些是常量,用于标识日历对象中可获取/设置/添
Date curr = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(curr);
int nweek = cal.WEEK_OF_YEAR;
int year = cal.YEAR;
但是现在我不知道怎么知道那周的第一天。我一直在寻找日历,日期,日期格式,但没有什么可能是有用的
有什么建议吗?(使用Java)这些字段不返回值。这些是常量,用于标识
日历
对象中可获取/设置/添加的字段。要实现所需,首先需要获取一个日历
,清除它并设置已知值。它会自动将日期设置为该周的第一天
// We know week number and year.
int week = 3;
int year = 2010;
// Get calendar, clear it and set week number and year.
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.WEEK_OF_YEAR, week);
calendar.set(Calendar.YEAR, year);
// Now get the first day of week.
Date date = calendar.getTime();
请学习阅读以了解如何使用类/方法/字段,不要尝试在IDE中随意插入;)
这就是说,
java.util.Date
和java.util.Calendar
是。如果可以,考虑切换到./p>< p>我在java中没有做很多事情,但是解决方法可能是:
cal.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR) - cal.get(Calendar.DAY_OF_WEEK));
逻辑:
获取一周中的某一天,并将其从当前日期中减去(可能需要-1,具体取决于您是需要周一作为一周的第一天还是周日)下面是一些快速而肮脏的代码。这段代码使用当前日期创建日历对象,计算一周中的当前日期,然后减去一周中的某一天,这样您就可以在第一天(星期日)了。虽然我使用的是一年中的第二天,但它可以很好地跨越几年(在2010年1月2日,它将返回2009年12月27日,这是正确的)
小心这些,如果是12月底并且已经是下一年结束的一周,
calendar.get(calendar.WEEK\u OF\u YEAR)
返回1
使用
将cal2日期设置为2009年底2010年12月29日
我用了这个:
cal2.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR)); //to round at the start of day
cal2.set(Calendar.YEAR, cal.get(Calendar.YEAR));
cal2.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); //to round at the start of week
我还确保日历中的周从周一开始,无论它们在什么地方:
cal.setFirstDayOfWeek(Calendar.MONDAY);
cal2.setFirstDayOfWeek(Calendar.MONDAY);
试试这个:
public static Calendar setWeekStart(Calendar calendar) {
while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
calendar.add(Calendar.DATE, -1);
}
setDayStart(calendar); // method which sets H:M:S:ms to 0
return calendar;
}
还有另一种方式
GregorianCalendar cal = new GregorianCalendar();
cal.clearTime();
Integer correction = 1-cal.get(GregorianCalendar.DAY_OF_WEEK)
cal.add(Calendar.DATE, correction);
卡尔现在是一周的第一天
1-cal.get(GregoriaCalendar.DAY/OF/u WEEK)
星期天(我所在地区的一周中的第一天)的计算结果为1-1,星期一的计算结果为1-2,因此这将为您提供将时钟倒回星期天所需的更正。请尝试使用公历算法:
public int getFirstDay(int m, int year)
{
int k=1;
int c, y, w, M=0;
if(m>2 && m<=12) M=m-2;
else if(m>0 && M<=2)
{
M=m+10;
year-=1;
}
c=year/100;
y=year%100;
w=(int)((k+(Math.floor(2.6*M - 0.2))-2*c+y+(Math.floor(y/4))+(Math.floor(c/4)))%7);//a fantastic formula
if(w<0) w+=7;
return w;//thus the day of the week is obtained!
}
public int getFirstDay(int m,int year)
{
int k=1;
int c,y,w,M=0;
如果(m>2&&m0&&m请注意,周数取决于区域设置。请绝对确保您的区域设置是正确的!目前使用的是Joda time,使用起来非常方便,我建议您切换到它谢谢,这正是我所需要的。无论如何,我将按照您的建议查看Joda time。我仍处于初级阶段,还没有o了解很多。@BalusC您在回答中给出的“epic failures”链接现在无法访问。请提供另一个链接,我真的想知道为什么这个日期和日历是epic failures。@dj:他们的API太糟糕了。看看JodaTime,这就是日期/时间API应该是什么样子。Calendar.MONDAY需要更改为Calendar.getFirstDayOfWeek()
GregorianCalendar cal = new GregorianCalendar();
cal.clearTime();
Integer correction = 1-cal.get(GregorianCalendar.DAY_OF_WEEK)
cal.add(Calendar.DATE, correction);
public int getFirstDay(int m, int year)
{
int k=1;
int c, y, w, M=0;
if(m>2 && m<=12) M=m-2;
else if(m>0 && M<=2)
{
M=m+10;
year-=1;
}
c=year/100;
y=year%100;
w=(int)((k+(Math.floor(2.6*M - 0.2))-2*c+y+(Math.floor(y/4))+(Math.floor(c/4)))%7);//a fantastic formula
if(w<0) w+=7;
return w;//thus the day of the week is obtained!
}