Как получить первый день недели число в 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()));
}
}