2010-01-21 98 views
20

让我来解释一下自己。通过了解周数和日期的年份:如何获得Java中给定周数的第一天

Date curr = new Date(); 
Calendar cal = Calendar.getInstance(); 
cal.setTime(curr); 
int nweek = cal.WEEK_OF_YEAR; 
int year = cal.YEAR; 

但现在我不知道怎么去那一周的第一天的日期。我一直在寻找日历,日期,日期格式,但没有什么可能是有用的...

任何建议? (使用Java)

回答

38

这些字段不返回值。这些是常量,它标识可以获取/设置/添加的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.Datejava.util.Calendarepic failures 。如果可以,请考虑切换到Joda Time

+3

请注意,周数与地区相关。绝对确定你的语言环境是正确的! – 2010-01-21 12:58:24

+1

目前使用乔达时间,所以更容易处理,我会建议切换到它 – 2010-01-21 13:09:50

+0

谢谢,这正是我需要的。无论如何,我会按照你的建议去看看乔达时间。我仍然处于初级水平,仍然需要学习很多东西。 – framara 2010-01-21 14:33:16

2

我没有做太多的东西日期在Java中,但一个解决方案可能是:

cal.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR) - cal.get(Calendar.DAY_OF_WEEK)); 

逻辑:

获取星期几,并从当前日期它。减去(可能需要 - 1,取决于你是否需要星期一是星期或星期日的第一天)

0

下面是一些快速和脏的代码来做到这一点。此代码创建一个包含当天日期的日历对象,计算一周中的当前日期,并减去一周中的第几天,以便您处于第一天(星期日)。尽管我正在使用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())); 
    } 
} 
0

要与谨慎,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); 
3

试试这个:

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; 
} 
+0

Calendar.MONDAY需要更改为calendar.getFirstDayOfWeek() – 2013-10-17 14:32:23

+0

确实,更新了它 – Tarion 2013-11-29 11:39:55

1

另一种方式......

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星期一,所以这会给你倒回时钟所需的修正值回至周日

0

尝试公历算法:

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! 
    } 
相关问题