Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中获取给定周数的第一天_Java_Calendar_Dayofweek - Fatal编程技术网

如何在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!
    }