检索当前周的周一日期

我们有一个实用工具,将在周一至周五之间的任何一天运行。 它将更新内容管理工具中的一些文件。 与该文件关联的最后修改日期应该是该周的星期一日期。 我编写了以下程序来检索当前周的星期一日期。 但我仍然不确定这是否适用于所有情况。 有没有人有更好的解决方案?

Calendar c = Calendar.getInstance(); c.setTime(new Date()); System.out.println(c.get(Calendar.DAY_OF_MONTH)); System.out.println(c.get(Calendar.DAY_OF_WEEK)); int mondayNo = c.get(Calendar.DAY_OF_MONTH)-c.get(Calendar.DAY_OF_WEEK)+2; c.set(Calendar.DAY_OF_MONTH,mondayNo); System.out.println("Date "+c.getTime()); 

我强烈建议使用Joda Time (对于你所有的日期/时间工作,而不仅仅是这个):

 // TODO: Consider time zones, calendars etc LocalDate now = new LocalDate(); LocalDate monday = now.withDayOfWeek(DateTimeConstants.MONDAY); System.out.println(monday); 

请注意,正如您在这里使用星期一那样 ,这是Joda Time中一周的第一天,这将始终返回较早的一天(或同一天)。 如果您选择星期三(例如),那么它将从周一或周二提前到周三。 如果您需要“下周三”或“上周三”,您可以随时添加或减去一周。

编辑:如果你真的想使用java.util.Date/Calendar,你可以使用:

 Calendar c = Calendar.getInstance(); c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); System.out.println("Date " + c.getTime()); 

您可以使用Calendar.setFirstDayOfWeek来指示一周是周一 – 周日还是周日 – 周六; 我相信设定一周的日期将保持在当前一周 – 但测试它。

TL;博士

 LocalDate previousMonday = LocalDate.now( ZoneId.of( "America/Montreal" ) ) .with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) ); 

java.time

java.util.Calendar类和Joda-Time库都已被Java 8及更高版本中内置的java.time框架取代。 请参阅Oracle教程 。 许多java.timefunction已经在ThreeTen-Backport中反向移植到Java 6和7,并在ThreeTenABP中进一步适应Android。

java.time.LocalDate类表示没有时间且没有时区的仅日期值。

确定今天的日期需要一个时区,即ZoneId

 ZoneId zoneId = ZoneId.of( "America/Montreal" ); LocalDate today = LocalDate.now( zoneId ); 

TemporalAdjuster接口(参见教程 )是一种操作日期时间值的强大而简单的方法。 TemporalAdjusters类(注意复数)实现了一些非常有用的调整。 这里我们使用previous( DayOfWeek)

方便的DayOfWeek枚举使您可以轻松指定星期几。

 LocalDate previousMonday = today.with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) ); 

如果今天星期一,并且您想在今天而不是一周前使用,请拨打previousOrSame


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC驱动程序 。 不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android(<26), ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。

以下内容适用,包括包装月份:

 Calendar c = Calendar.getInstance(); c.setFirstDayOfWeek(Calendar.MONDAY); c.setTime(new Date()); int today = c.get(Calendar.DAY_OF_WEEK); c.add(Calendar.DAY_OF_WEEK, -today+Calendar.MONDAY); System.out.println("Date "+c.getTime()); 

但是,如果您在星期日(例如2月12日星期日)编辑您的申请,则该日期将在下一个星期一。 根据您的要求(该应用程序仅在周一至周五运行),这不应该成为问题。

正如乔恩所建议的那样,calendar.set方法有效…我已经在同一个月的星期一和使用以下代码段的另一个月中测试了它:

 Calendar c = Calendar.getInstance(); //ensure the method works within current month c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); System.out.println("Date " + c.getTime()); //go to the 1st week of february, in which monday was in january c.set(Calendar.DAY_OF_MONTH, 1); System.out.println("Date " + c.getTime()); //test that setting day_of_week to monday gives a date in january c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); System.out.println("Date " + c.getTime()); //same for tuesday c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY); System.out.println("Date " + c.getTime()); 

结果:

 Date Mon Feb 13 10:29:41 CET 2012 Date Wed Feb 01 10:29:41 CET 2012 Date Mon Jan 30 10:29:41 CET 2012 Date Tue Jan 31 10:29:41 CET 2012 

如何使用Joda Time库…看看这个答案 ……

如果您不想使用Joda Time,您可以这样做以找到周 – >(适用于Android)

 public static ArrayList getWeeks(int month) { ArrayList arrayListValues = new ArrayList<>(); SimpleDateFormat sdf = new SimpleDateFormat("MMMM d"); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MONTH, month); int day = calendar.get(Calendar.DAY_OF_WEEK); while (day != 1) { calendar.add(Calendar.DATE, 1); day = calendar.get(Calendar.DAY_OF_WEEK); } calendar.add(Calendar.DATE, -14); String y1 = sdf.format(calendar.getTime()); calendar.add(Calendar.DATE, 6); String y2 = sdf.format(calendar.getTime()); calendar.add(Calendar.DATE, 1); arrayListValues.add(y1 + " - " + y2); y1 = sdf.format(calendar.getTime()); calendar.add(Calendar.DATE, 6); y2 = sdf.format(calendar.getTime()); calendar.add(Calendar.DATE, 1); arrayListValues.add(y1 + " - " + y2); for (int i = 0; i < 10; i++) { y1 = sdf.format(calendar.getTime()); calendar.add(Calendar.DATE, 6); y2 = sdf.format(calendar.getTime()); calendar.add(Calendar.DATE, 1); arrayListValues.add(y1 + " - " + y2); } return arrayListValues; } 

如果星期一星期一是前一个月,它将无法工作……例如,如果今天是6月1日星期五……你应该宁愿使用滚动法……