Как получить первый день номера данной недели в Java
Позвольте мне объяснить. Зная номер недели и год даты:
Date curr = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(curr);
int nweek = cal.WEEK_OF_YEAR;
int year = cal.YEAR;
Но теперь я не знаю, как получить дату первого дня этой недели. Я искал календарь, дату, дату, но ничего полезного...
Любое предложение? (работает на Java)
Ответы
Ответ 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!
}