Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Эти поля не возвращают значения. Это константы, которые идентифицируют поля в объекте 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 являются эпическими неудачами. Если вы можете, подумайте о переходе на Joda Time.

Ответ 2

Попробуйте следующее:

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

Ответ 3

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

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

Логика:

Получите день недели и вычтите его с текущей даты (может потребоваться -1, в зависимости от того, кому вы должны в понедельник быть первым днем ​​недели или воскресеньем)

Ответ 4

Еще один способ...

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

Ответ 5

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

Ответ 6

Будьте осторожны с теми, 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);

Ответ 7

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

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