【问题标题】:Get first day of a particular week in Joda-Time? java在 Joda-Time 中获取特定一周的第一天?爪哇
【发布时间】:2011-06-13 04:59:18
【问题描述】:

Joda-Time,有没有办法获取一周中第一天(星期一)的日期。

例如,我想根据今天的当前日期 21/01/11 找出本周星期一的日期

提前干杯。

编辑:我还希望找到一周结束的日期,即星期天的日期。干杯

【问题讨论】:

    标签: java jodatime


    【解决方案1】:

    试试LocalDate.withDayOfWeek:

    LocalDate now = new LocalDate();
    System.out.println(now.withDayOfWeek(DateTimeConstants.MONDAY)); //prints 2011-01-17
    System.out.println(now.withDayOfWeek(DateTimeConstants.SUNDAY)); //prints 2011-01-23
    

    【讨论】:

    • 进一步提示:您可以致电isBefore/isAfterminusWeeks/plusWeeks 获取过去/未来的值。
    • 可能不适用于星期天或星期六开始的国家/地区
    • 我知道这是旧的,但我使用的是 Java 8,这些方法肯定不再存在。我仍然找不到不使用日历的问题的解决方案。
    • @Zephyr 这些方法不是核心 Java 方法,而是来自 Joda-Time 库(参见问题)。请参阅this answer,了解使用 Java8 中新的 Date 框架的解决方案。
    【解决方案2】:
    LocalDate today = new LocalDate();
    LocalDate weekStart = today.dayOfWeek().withMinimumValue();
    LocalDate weekEnd = today.dayOfWeek().withMaximumValue();
    

    会给你第一天和最后一天,即周一和周日

    【讨论】:

    • 我认为这些方法已经不存在了,我现在找不到了。
    • 请@Dandre Allison,注意它是LocalDate。方法还在。
    • @sudhir 谢谢,这是比接受的更好的答案。也适用于 DateTime。
    • 完美的解决方案,适合想知道是否应该使用 MON 或 SUN 来开始一周的人,谢谢!
    • 我知道这是旧的,但我使用的是 Java 8,这些方法肯定不再存在了。
    【解决方案3】:

    另一种选择是使用roundFloorCopy。如下所示:

    LocalDate startOfWeek = new LocalDate().weekOfWeekyear().roundFloorCopy();
    

    对于the standard week(星期日)的最后一天,请使用roundCeilingCopyminusDays...

    LocalDate lastDateOfWeek = new LocalDate().weekOfWeekyear().roundCeilingCopy().minusDays( 1 );
    

    也适用于日期时间。并且适用于周末(独家)。

    DateTime dateTime = new DateTime();
    DateTime startOfWeek = dateTime.weekOfWeekyear().roundFloorCopy();
    DateTime endOfWeek = dateTime.weekOfWeekyear().roundCeilingCopy();
    

    转储到控制台...

    System.out.println( "dateTime " + dateTime );
    System.out.println( "startOfWeek " + startOfWeek );
    System.out.println( "endOfWeek " + endOfWeek );
    

    运行时……

    dateTime 2014-01-24T00:00:34.955-08:00
    startOfWeek 2014-01-20T00:00:00.000-08:00
    endOfWeek 2014-01-27T00:00:00.000-08:00
    

    【讨论】:

    • 此代码对我不起作用。当我尝试LocalDate startOfWeek = new LocalDate().dayOfWeek().roundFloorCopy();LocalDate endOfWeek = new LocalDate().dayOfWeek().roundCeilingCopy(); 时,两种情况下我都会得到今天的日期(今天是星期四)。我正在使用 Joda-Time 2.3 和 Java 8 beta 123。
    • @BasilBourque 感谢您指出错误。 dayOfWeek 是错误的字段。使用weekOfWeekyear,它可以正常工作。
    • 不错。这适用于 DateTime,甚至可以将时间清除到第一时刻。您在代码中使用LocalDate 是否有原因?
    • @BasilBourque 不,这只是因为 OP 在他的问题中使用了 21/01/11,这只是一个没有时间的日期。
    • 好答案。方法也不错。
    【解决方案4】:

    您可以使用 getDayOfWeek() 方法返回 1 代表星期一,2 代表星期二,..,7 代表星期日,以便返回那么多天并到达星期一:

    import org.joda.time.DateTime;
    
        public class JodaTest {
    
            public static void main(String[] args) {
                DateTime date = new DateTime();
                System.out.println(date);
                        //2011-01-21T15:06:18.713Z
                System.out.println(date.minusDays(date.getDayOfWeek()-1));
                        //2011-01-17T15:06:18.713Z
            }
        }
    

    【讨论】:

      【解决方案5】:

      参见"Querying DateTimes" of the Joda-Time user guide部分。

      这是我要遵循的一般算法:

      1. 找到目标日期的星期几(您提到的 2011 年 1 月 21 日)
      2. 确定比星期一提前多少天
      3. 使用dateTime.minusDays(n)从目标日期中减去#2的值

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-24
        • 2012-11-16
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多