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

Java 检索上周一和周五日期的最佳方法是什么,java,date,datetime,calendar,Java,Date,Datetime,Calendar,我需要上星期一和星期五的日期。为此,我得到了本周星期一的日期,减去7天。这给了我上星期一的日期 为了得到星期五的日期,我必须加上4。这让我有点困惑,因为在英国,一周的第一天是星期天,而不是星期一 不管怎样,这是我得到日期的方式 // Get the dates for last MON & FRI Calendar cal = Calendar.getInstance(); cal.setTime(date); c

我需要上星期一和星期五的日期。为此,我得到了本周星期一的日期,减去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);
上述方法有效,但我感兴趣的是逻辑是否有任何错误。也就是说,它在二月、闰年等期间有效吗

请随意提出更好的解决方案/方法


谢谢

我唯一看到的错误是,您实际上正在测试范围Mo Fr,而不是,如前所述,检索两个特定的日期。使用独占上限测试范围Mo Sa会更安全。

注意:对于Java 8及以上版本,请查看的答案()。
Java8引入了一个新的时间/日期API,它提供了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);
您可以从
java.util.Date
对象创建
DateTime
对象,反之亦然,这样就可以轻松地使用java日期


将上述代码与日期一起使用

DateTime today = new DateTime("2012-09-30");
星期一的结果为“2012-09-17”,星期五的结果为“2012-09-21”,将日期设置为

DateTime tomorrow = new DateTime("2012-10-01");

星期一的结果为“2012-09-24”,星期五的结果为“2012-09-28”。

您仍然将周初设置为星期日,这意味着
日历。星期六的星期一是前一个星期一,而
日历。星期日的星期一是第二天

你需要做的是(根据你上面的评论,根据你的意愿),将一周的开始时间设置为周一

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

cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
cal.add(Calendar.DAY_OF_WEEK, -7); 
...
除此之外,周五的最后一秒也不在范围之内,你的逻辑似乎是正确的,应该不会有闰年/DST转换等问题。

tl;博士 获取上周星期一和星期五的日期

避免遗留日期时间类 其他答案使用了麻烦的旧遗留日期时间类,现在被java.time问题所取代

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

TemporalAdjuster
该界面提供了从一个日期时间值到另一个日期时间值的调整。在类中找到方便的实现(注意复数's')。
previous
调整器从枚举中查找任何指定的对象

这个问题并没有准确定义“上周”。最后七天?标准周一周日时段?本地化的一周,比如美国的星期日和星期六?今天的前一周或包括今天的部分周

我将假定前七天是预定的

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

顺便说一下,如果你想考虑初始日期,如果它恰好是一周中所希望的一天,请使用备用<代码> TemporalAdjuster < /Cord>实现:或.< /P>


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(因为周是固定的,我不认为二月或闰年有任何问题:如果今天是星期一,那么最后一个星期一是七天前。如果你昨天运行它,你会期望什么结果?如果你今天运行它呢?昨天它会将2012-09-17作为星期一,今天是2012-09-24。我希望它返回上周周一和周五的日期。所以如果我如果我在新的一周的明天跑步,它会给我24和29分。你如何定义“上周”呢?最后七天?标准周一周日时段?本地化的一周,如美国的周日周六?今天一周之前的一周或包括今天的部分周?我不太明白你的意思。检索两个具体日期(周一和周五)这就是我想做的。你的意思是我应该得到周一到周六的范围,然后得到周一和周五的日期吗?齐吉,我看到你把周五的日期定为23:59:59。这对我来说是一个强烈的信号,你的意图是将一些日期的范围作为上限进行检查。我的建议是使用星期六午夜作为唯一的上限。@gekkostate根据要求,我建议了一个更好的方法。为什么你认为这不符合答案的条件?单是单词计数会困扰你吗?你好,Marko,我需要在数据库中运行一个查询来检索报告的数据。我想在报告中包含的数据仅来自星期一morning到周五晚上。我不想包括周六的数据。Ziggy这正是我的观点。使用周六午夜作为唯一上限是实现这一目标的正确方法
      ZoneId z = ZoneId.of( “America/Montreal” );
      LocalDate today = LocalDate.now( z );
      
      LocalDate previousMonday = today.with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) ) ;
      LocalDate previousFriday = today.with( TemporalAdjusters.previous( DayOfWeek.FRIDAY ) ) ;