如何获得Java中给定周数的第一天
让我来解释一下自己。通过了解周数和日期的年份:如何获得Java中给定周数的第一天
Date curr = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(curr);
int nweek = cal.WEEK_OF_YEAR;
int year = cal.YEAR;
但现在我不知道怎么去那一周的第一天的日期。我一直在寻找日历,日期,日期格式,但没有什么可能是有用的...
任何建议? (使用Java)
这些字段不返回值。这些是常量,它标识可以获取/设置/添加的Calendar
对象中的字段。要达到您想要的效果,您首先需要获得Calendar
,清除它并设置已知值。它会自动将日期设置为当周的第一天。
// 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();
请学会阅读的javadocs来学习如何使用类/方法/字段,不要试图捅在IDE中随机;)
这就是说,java.util.Date
和java.util.Calendar
是epic failures 。如果可以,请考虑切换到Joda Time。
我没有做太多的东西日期在Java中,但一个解决方案可能是:
cal.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR) - cal.get(Calendar.DAY_OF_WEEK));
逻辑:
获取星期几,并从当前日期它。减去(可能需要 - 1,取决于你是否需要星期一是星期或星期日的第一天)
下面是一些快速和脏的代码来做到这一点。此代码创建一个包含当天日期的日历对象,计算一周中的当前日期,并减去一周中的第几天,以便您处于第一天(星期日)。尽管我正在使用DAY_OF_YEAR,但它仍然可以正常使用(在1/2/10之后它将返回12/27/09这是正确的)。
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DOW {
public static void main(String[] args) {
DOW dow = new DOW();
dow.doIt();
System.exit(0);
}
private void doIt() {
Date curr = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(curr);
int currentDOW = cal.get(Calendar.DAY_OF_WEEK);
cal.add(Calendar.DAY_OF_YEAR, (currentDOW * -1)+1);
Format formatter = new SimpleDateFormat("MM/dd/yy");
System.out.println("First day of week="+formatter.format(cal.getTime()));
}
}
要与谨慎,calendar.get(Calendar.WEEK_OF_YEAR)
返回1,如果是12月的结束,已经是在明年结束一个星期。
使用
// cal2.set(Calendar.WEEK_OF_YEAR, cal.get(Calendar.WEEK_OF_YEAR));
// cal2.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
设置CAL2日期到例如2009年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;
}
Calendar.MONDAY需要更改为calendar.getFirstDayOfWeek() – 2013-10-17 14:32:23
确实,更新了它 – Tarion 2013-11-29 11:39:55
另一种方式......
GregorianCalendar cal = new GregorianCalendar();
cal.clearTime();
Integer correction = 1-cal.get(GregorianCalendar.DAY_OF_WEEK)
cal.add(Calendar.DATE, correction);
CAL现在是一周的第一天
1-cal.get(GregorianCalendar.DAY_OF_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!
}
请注意,周数与地区相关。绝对确定你的语言环境是正确的! – 2010-01-21 12:58:24
目前使用乔达时间,所以更容易处理,我会建议切换到它 – 2010-01-21 13:09:50
谢谢,这正是我需要的。无论如何,我会按照你的建议去看看乔达时间。我仍然处于初级水平,仍然需要学习很多东西。 – framara 2010-01-21 14:33:16