如何在Java中获取给定周数的第一天

时间:2010-01-21 12:34:01

标签: 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工作)

7 个答案:

答案 0 :(得分:39)

这些字段不返回值。这些是常量,它标识了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

答案 1 :(得分: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;
}

答案 2 :(得分:2)

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

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

逻辑:

获取当天的日期并从当前日期减去它(可能需要-1,具体取决于你需要星期一作为一周的第一天或星期日)

答案 3 :(得分: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-2,所以这将为您提供将时钟倒回到星期日所需的更正

答案 4 :(得分:0)

这是一些快速而脏的代码。此代码创建一个日历对象,其中包含当天的日期,计算当前的星期几,并减去星期几,以便您在第一天(星期日)。虽然我正在使用DAY_OF_YEAR,但它经历了多年的罚款(在1/2/10,它将在12月27日返回,这是正确的。)

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

答案 5 :(得分:0)

谨慎对待,calendar.get(Calendar.WEEK_OF_YEAR)如果是12月底则返回1,并且已经是明年结束的一周。

使用

//            cal2.set(Calendar.WEEK_OF_YEAR, cal.get(Calendar.WEEK_OF_YEAR));
//            cal2.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

将cal2日期设置为例如2009年底29/12/2010 !!

我用过这个:

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

答案 6 :(得分: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!
    }