获取星期的开始日期(可配置的开始星期几)

我有当前的日期,并且是一个常数,它告诉我们从哪一天开始。 我想根据该常数得到一周的开始日期。 如果我将一周的第一天硬编码到星期一(或任何东西),那么这很简单。 但是一周的第一天不断变化。 因此,每次要更改第一天时,我都不想更改代码。

这是我用java的日历试过的:

public static Date getLastWeekdayDate() { Calendar calendar = new GregorianCalendar(); int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); int daysToSubtractFromCurrentDate = 0; switch (dayOfWeek) { case Calendar.WEDNESDAY: daysToSubtractFromCurrentDate = 4; break; case Calendar.THURSDAY: daysToSubtractFromCurrentDate = 5; break; case Calendar.FRIDAY: daysToSubtractFromCurrentDate = 6; break; case Calendar.SATURDAY: daysToSubtractFromCurrentDate = 0; break; case Calendar.SUNDAY: daysToSubtractFromCurrentDate = 1; break; case Calendar.MONDAY: daysToSubtractFromCurrentDate = 2; break; case Calendar.TUESDAY: daysToSubtractFromCurrentDate = 3; break; } calendar.add(Calendar.DATE, -daysToSubtractFromCurrentDate); calendar.set(Calendar.AM_PM, Calendar.AM); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.HOUR, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime(); } 

我想得到一周的开始日期。 上述函数返回一周的第一天,并将周开始日硬编码为星期六。 每当需求超出一周的开始日期时,我都必须更改代码。

来自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; eg, SUNDAY in the US, MONDAY in France. Returns: the first day of the week. See Also: 

我使用以下方法:

 /** 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(); } 

TL;博士

 LocalDate.now( ZoneId.of( "America/Montreal" ) ) .with( TemporalAdjusters.previousOrSame( DayOfWeek.SUNDAY ) ) // Specify your desired `DayOfWeek` as start-of-week. .atStartOfDay( ZoneId.of( "America/Montreal" ) ) 

请参阅IdeOne.com上的此代码 。

zdt:2017-07-09T00:00-04:00 [美国/蒙特利尔] | 星期几:星期日

避免遗留类

您正在使用现在遗留的麻烦的旧日期时间类,取而代之的是java.time类。

DayOfWeek

而不是仅使用整数来表示代码中的星期几,而是使用Java中内置的DayOfWeek 枚举 。 这样可以增强类型安全性,确保有效值,并使代码更具自我记录能力。

 DayOfWeek weekStart = DayOfWeek.SUNDAY ; // Pass whatever `DayOfWeek` object you want. 

TemporalAdjusterLocalDate

TemporalAdjuster接口允许操作日期以获取另一个日期的方法。 在TemporalAdjusters类中找到一些实现(注意复数)。

 ZoneId z = ZoneId.of( "America/Montreal" ) ; LocalDate today = LocalDate.now( z ) ; LocalDate start = today.with( TemporalAdjusters.previousOrSame( weekStart ) ) ; 

ZonedDateTime

要获得确切的时刻,请向LocalDate询问当天的第一时刻。 那个时刻取决于时区,因为在任何特定时刻,日期在全球范围内变化。

 ZonedDateTime zdt = start.atStartOfDay( z ) ; 

Instant

如果要以UTC格式查看某个时刻,请提取Instant对象。

 Instant instant = zdt.toInstant() ; // Same moment, different wall-clock time.