I have current date, and a constant which tells from which day the week starts. I want to get the start date of the week based on that constant. If I hardcode the first day
From the java calendar API http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#getFirstDayOfWeek()
public int getFirstDayOfWeek()
Gets what the first day of the week is; e.g., SUNDAY in the U.S., MONDAY in France.
Returns:
the first day of the week.
See Also:
I used the following method:
/** 1 = Sunday, 2 = Monday, 3 = Tuesday, 4 = Wednesday, 5 = Thursday,
* 6 = Friday, 7 = Saturday
*/
public static Date getFirstDayOfWeekDate(int firstDay)
{
// Calculate the date of the first day of the week
// First get the today's date
Calendar c = new GregorianCalendar();
// Now set the day of week to the first day of week
while (c.get(Calendar.DAY_OF_WEEK) != firstDay)
{
c.add(Calendar.DAY_OF_MONTH, -1);
}
return c.getTime();
}
DateTimeFormatter format = DateTimeFormatter.ofPattern("MM/dd/yyyy");
LocalDate now = LocalDate.now();
String startDate = now.with(TemporalAdjusters.previous(DayOfWeek.SUNDAY)).format(format);
LocalDate.now( ZoneId.of( "America/Montreal" ) )
.with( TemporalAdjusters.previousOrSame( DayOfWeek.SUNDAY ) ) // Specify your desired `DayOfWeek` as start-of-week.
.atStartOfDay( ZoneId.of( "America/Montreal" ) )
See this code run live at IdeOne.com.
zdt: 2017-07-09T00:00-04:00[America/Montreal] | day-of-week: SUNDAY
You are using the troublesome old date-time classes that are now legacy, supplanted by the java.time classes.
DayOfWeek
Rather than use mere integer numbers to represent day-of-week in your code, use the DayOfWeek enum built into Java. This gains you type-safety, ensures valid values, and makes your code more self-documenting.
DayOfWeek weekStart = DayOfWeek.SUNDAY ; // Pass whatever `DayOfWeek` object you want.
TemporalAdjuster
& LocalDate
The TemporalAdjuster
interface enables ways to manipulate a date to get another date. Find some implementations in TemporalAdjusters
class (note plural).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
LocalDate start = today.with( TemporalAdjusters.previousOrSame( weekStart ) ) ;
ZonedDateTime
To get an exact moment, ask the LocalDate
for its first moment of the day. That moment depends on a time zone, as the date varies around the globe for any given moment.
ZonedDateTime zdt = start.atStartOfDay( z ) ;
Instant
If you want to view that some moment as in UTC, extract an Instant
object.
Instant instant = zdt.toInstant() ; // Same moment, different wall-clock time.