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

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

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

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

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


person framara    schedule 21.01.2010    source источник


Ответы (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();

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

Тем не менее, java.util.Date и java.util.Calendar являются эпическими провалами. Если есть возможность, рассмотрите возможность перехода на Joda Time.

person BalusC    schedule 21.01.2010
comment
Обратите внимание, что номера недель зависят от локали. Будьте абсолютно уверены в правильности вашего языка! - person Thorbjørn Ravn Andersen; 21.01.2010
comment
в настоящее время используется время Joda, с ним намного проще работать, я бы рекомендовал переключиться на него - person Craig Angus; 21.01.2010
comment
Спасибо, это именно то, что мне было нужно. В любом случае, я собираюсь взглянуть на Joda Time, как вы предложили. Я все еще на начальном уровне, мне еще предстоит многому научиться. - person framara; 21.01.2010
comment
@BalusC Ссылка на «эпические неудачи», которую вы дали в ответе, сейчас недоступна. Пожалуйста, дайте другую ссылку, я действительно хочу знать, почему эта Дата и Календарь были эпическим провалом. - person Syed Aqeel Ashiq; 20.08.2013
comment
@dj: их API просто ужасен. Посмотрите на JodaTime, так должен был выглядеть API даты/времени. - person BalusC; 20.08.2013

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

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;
}
person Vojta    schedule 28.02.2012
comment
Calendar.MONDAY необходимо изменить на calendar.getFirstDayOfWeek() - person Yaroslav Mytkalyk; 17.10.2013

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

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

Логика:

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

person Morfildur    schedule 21.01.2010

Еще способ...

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

person chim    schedule 12.09.2012

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

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

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!
    }
person NovoBook    schedule 30.07.2013

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