检索当前周的周一日期

Sha*_*dne 25 java calendar date dayofweek

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

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());
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 47

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

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

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

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

Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Date " + c.getTime());
Run Code Online (Sandbox Code Playgroud)

您可以Calendar.setFirstDayOfWeek用来指示一周是周一至周日还是周日至周六; 我相信设定一周的日期将保持在本周内 - 但测试它.

  • 它没有在星期天工作.这将是下周的星期一. (3认同)
  • @ShashankKadne:当然可以,但是-很糟糕。如果您进行大量基于日期的工作,那么使用Joda Time的好处将远远超过短暂的花费。 (2认同)

Bas*_*que 19

TL;博士

LocalDate previousMonday = 
    LocalDate.now( ZoneId.of( "America/Montreal" ) )
             .with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) );
Run Code Online (Sandbox Code Playgroud)

java.time

java.util.Calendar类和Joda-Time库都已被Java 8及更高版本中内置的java.time框架取代.请参阅Oracle教程.多的java.time功能已被后移植到Java 6和7在ThreeTen-反向移植并且还适于在到Android ThreeTenABP.

java.time.LocalDate级表示没有时间一天和不同时区的日期,唯一的价值.

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

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );
Run Code Online (Sandbox Code Playgroud)

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

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

LocalDate previousMonday = today.with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) );
Run Code Online (Sandbox Code Playgroud)

如果今天星期一,而你想今天而不是一周前使用,请致电previousOrSame.


关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

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

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

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

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.

  • @peceps重读第一段.可用作Java 6,Java 7和Android的后端口.所以java.time是使用Java的最佳方法. (2认同)

rad*_*mpe 6

以下内容可行,包括包装月份:

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());
Run Code Online (Sandbox Code Playgroud)

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