检索上周一和周五的日期的最佳方法是什么

zig*_*ggy 8 java datetime calendar date

我需要得到上周一和周五的日期.为此,我将获得本周一的日期并减去7天.这给了我上周一的星期一.

为了得到星期五的日期,我必须加上4.这让我感到困惑,因为出于某种原因,一周的第一天是星期日,而不是星期一在英国.

无论如何,这是我如何得到日期.

            // Get the dates for last MON & FRI
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);

        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        cal.add(Calendar.DAY_OF_WEEK, -7);

        cal.set(Calendar.HOUR_OF_DAY,0);
        cal.set(Calendar.MINUTE,0);
        cal.set(Calendar.SECOND,0);
        cal.set(Calendar.MILLISECOND,0);

        // Get the date on Friday
        cal.add(Calendar.DAY_OF_WEEK, 4);

        cal.set(Calendar.HOUR_OF_DAY,23);
        cal.set(Calendar.MINUTE,59);
        cal.set(Calendar.SECOND,59);
        cal.set(Calendar.MILLISECOND,0);
Run Code Online (Sandbox Code Playgroud)

上述工作,但我感兴趣,如果逻辑有任何问题.即它适用于Februarys,闰年等.

随意建议更好的解决方案/方法.

谢谢

Bas*_*que 13

TL;博士

获取上周一和周五的日期

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

避免遗留日期时间类

其他答案使用现在由java.time问题取代的麻烦的旧遗留日期时间类.

LocalDate

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

时区对于确定日期至关重要.对于任何给定的时刻,日期在全球范围内因地区而异.例如,法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是"昨天" .

ZoneId z = ZoneId.of( “America/Montreal” );
LocalDate today = LocalDate.now( z );
Run Code Online (Sandbox Code Playgroud)

TemporalAdjuster

TemporalAdjuster接口提供了调整,从一个日期时间值移动到另一个.在TemporalAdjusters课堂上找到方便的实现(注意复数的's').所述previous调整器发现从任何指定的对象DayOfWeek的枚举.

该问题没有完全定义"上周".过去七天?标准周一至周日期间?本地化周,如美国的周日至周六?在今天的一周之前的一周或包括今天的部分周?

我将假设前七天是有意的.

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

顺便说一句,如果您想要考虑初始日期(如果它恰好已经是所需的星期几),请使用其他TemporalAdjuster实现:previousOrSamenextOrSame.


关于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,和更多.


Mod*_*ens 9

注意:对于Java 8及以上版本,请查看Basil Bourque的回答(链接).
Java 8引入了一个新的时间/日期API,它提供了Joda-Time的大部分功能.


Joda-Time为这类问题提供了非常好的方法.

使用Joda Time获取上周一周五和周五的日期看起来像这样:

DateTime today = DateTime.now();
DateTime sameDayLastWeek = today.minusWeeks(1);
DateTime mondayLastWeek = sameDayLastWeek.withDayOfWeek(DateTimeConstants.MONDAY);
DateTime fridayLastWeek = sameDayLastWeek.withDayOfWeek(DateTimeConstants.FRIDAY);
Run Code Online (Sandbox Code Playgroud)

您可以DateTimejava.util.Date对象创建对象,反之亦然,因此可以轻松使用Java日期.


使用上面的代码与日期

DateTime today = new DateTime("2012-09-30");
Run Code Online (Sandbox Code Playgroud)

结果是星期一的"2012-09-17"和星期五的"2012-09-21",将日期设置为

DateTime tomorrow = new DateTime("2012-10-01");
Run Code Online (Sandbox Code Playgroud)

结果是星期一的"2012-09-24"和星期五的"2012-09-28".


Joa*_*son 6

您仍然将一周的开始设置为星期日,这意味着Calendar.MONDAY星期六是前Calendar.MONDAY一个星期一,而星期日是第二天。

你需要做的是(根据你上面的评论,根据你想要的方式),将一周的开始设置为星期一。

Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);

cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
cal.add(Calendar.DAY_OF_WEEK, -7); 
...
Run Code Online (Sandbox Code Playgroud)

除此之外,并且星期五的最后一秒不包括在范围内,您的逻辑似乎是合理的,并且应该不会遇到闰年/夏令时变化等问题。


Mar*_*nik 1

我认为唯一错误的是,您实际上是在测试Mo-Fr范围,而不是如所述检索特定的两天。测试具有专属上限的 Mo-Sa 范围会更安全。