获取星期的开始日期(可配置的开始星期几)
我有当前的日期,并且是一个常数,它告诉我们从哪一天开始。 我想根据该常数得到一周的开始日期。 如果我将一周的第一天硬编码到星期一(或任何东西),那么这很简单。 但是一周的第一天不断变化。 因此,每次要更改第一天时,我都不想更改代码。
这是我用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.
TemporalAdjuster
& LocalDate
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.