检索当前星期一的日期tl;博士java.time关于 java.time

2022-09-01 11:14:43

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

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());

答案 1

我强烈建议使用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 来指示一周是周一-周日还是周日-周六;我相信设置星期几将保持在当前周内 - 但请对其进行测试。


答案 2

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.time功能已经移植到ThreeTen-Backport中的Java 6和7,并在ThreeTenABP中进一步适应Android。使用现代Android工具及其“API脱糖”,您无需添加任何库。

java.time.LocalDate 类表示一个仅日期值,不带时间,也不带时区。

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

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

时态调整接口(请参阅教程)是操作日期时间值的强大而简单的方法。TemporalAdjusters 类(注意复数)实现了一些非常有用的调整。在这里,我们使用上一个(星期几)。

方便的 DayOfWeek 枚举使指定星期几变得容易。

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

如果今天星期一,并且您想使用今天而不是一周前,请致电上一个OrSame


关于 java.time

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

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

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

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

从哪里获取 java.time 类?

要与哪个版本的 Java 或 Android 一起使用的 java.time 库的表

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