Как получить первый день недели число в Java

позвольте мне объяснить. Зная номер недели и год даты:

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

но теперь я не знаю, как получить дату первого дня этой недели. Я искал в календаре, дате, DateFormat, но ничего, что может быть полезно...

любое предложение? (работает на Java)

7 ответов


эти поля не возвращают значения. Это константы который идентифицирует поля в 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();

пожалуйста, научиться читать the javadocs чтобы узнать, как использовать классы / методы / поля и не пытайтесь тыкать случайным образом в вашей IDE ;)

об этом сказал java.util.Date и java.util.Calendar are эпичные фейлы. Если вы можете, подумайте о переключении на Джода Времени.


попробуйте это:

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

Я не сделал много дат в java, но решение может быть:

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

логика:

получить день недели и вычесть его из текущей даты (может потребоваться -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 для понедельника, поэтому это даст вам коррекцию, необходимую для перемотки часов назад в воскресенье


будьте осторожны с теми, calendar.get(Calendar.WEEK_OF_YEAR) возвращает 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);

попробуйте алгоритм григорианского календаря:

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!
    }

вот быстрый и грязный код для этого. Этот код создает объект календаря с датой текущего дня, вычисляет текущий день недели и вычитает день недели, так что вы находитесь на первом (воскресенье). Хотя я использую 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()));
    }
}