【问题标题】:How to get the previous Monday 2-00 a.m.?如何获得前一个星期一凌晨 2 点到 00 点?
【发布时间】:2015-11-21 06:01:07
【问题描述】:

我在 Java 7 中。

我是Joda-Time 的新手,想问一个简单的问题。如何获得前一个星期一凌晨 2 点到 00 点的日期?我的意思是:

____________________________________________________________________________
                              Week 1                          |   Week 2    |
______________________________________________________________|_____________|
 MONDAY       TUESDAY WENDSDAY THURSDAY FRIDAY SATURDAY SUNDAY|  MONDAY ... |
2-00 a.m.                                                     | 2-00 a.m.   |
______________________________________________________________|_____________|

所以,我需要返回 Week 1 的星期一凌晨 2 点到 00 点。 iff 当前时间介于 Week 1 的星期一凌晨 2 点到 00 点和 Week 2 的星期一 2-00 a.m. 之间。

有没有一种相对简单的方法可以通过 Joda-Time 实现这一目标?

【问题讨论】:

  • 你把上午和下午混在一起了吗?在你的问题?有点混乱

标签: java date time jodatime


【解决方案1】:

首先,Joda-Time 中的解决方案。其次,Java 8 及更高版本中内置的新 java.time 框架中的类似解决方案,旨在作为 Joda-Time 的继任者。见Tutorial

以下两种解决方案都遵循类似的逻辑,综合总结如下。 Joda DateTimeJava8 LocalDateTime 使用 fluent interface 提供不可变的日期时间实现。要到达上周的星期一凌晨 2 点,您可以采取以下步骤,使用流利的界面链接后续调用:

  1. 使用LocalDateTime.minus 方法通过减去星期几和星期一之间的差来获取过去星期一的当前时间
  2. 减去今天的毫秒数,得到过去的星期一上午 00:00
  3. 使用 LocalDateTime.plus 方法添加 2 小时。

乔达时间

    DateTime currentTime = new DateTime();
    DateTime dateResult;
    boolean shouldReturnLastMonday = (currentTime.getDayOfWeek() != DateTimeConstants.MONDAY ||
            currentTime.hourOfDay().get() < 2);
    if (shouldReturnLastMonday) {
        dateResult = currentTime.minus(Days.days(currentTime.getDayOfWeek() - DateTimeConstants.MONDAY))
                .minus(currentTime.getMillisOfDay())
                .plus(Hours.hours(2));
    } else {
        dateResult = currentTime.minus(currentTime.getMillisOfDay())
                .plus(Hours.hours(2));
    }
    System.out.println(dateResult);

java.time

  LocalDateTime currentTime = LocalDateTime.now();
  LocalDateTime dateResult;
  boolean shouldReturnLastMonday = (currentTime.getDayOfWeek() != DayOfWeek.MONDAY) ||
                                    (currentTime.getDayOfWeek() != DayOfWeek.MONDAY && currentTime.getHour() < 2);
  if(shouldReturnLastMonday) {
      dateResult = currentTime.minus(currentTime.getDayOfWeek().getValue() - DayOfWeek.MONDAY.getValue(), ChronoUnit.DAYS)
              .minus(currentTime.getLong(ChronoField.MILLI_OF_DAY), ChronoUnit.MILLIS)
              .plus(2, ChronoUnit.HOURS);
  } else {
      dateResult = currentTime.minus(currentTime.getLong(ChronoField.MILLI_OF_DAY), ChronoUnit.MILLIS)
              .plus(2,ChronoUnit.HOURS);
  }

【讨论】:

  • 在这种情况下是否可以使用 Java 7 或者我需要 JodaTime?
  • 我添加了一个 Jodatime 解决方案,这也可以在 Java 7 中完成,但 jodatime 或 java 8 api 更干净
  • 我觉得这个答案很好,但可能需要对其背后的机械过程进行更多解释。
  • @vsnyc 这个答案很有帮助,但可以通过一些讨论或解释来改进。 StackOverflow 不仅仅是 code-sn-p 库。
  • 感谢您的反馈,稍后会添加一些解释。
猜你喜欢
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2023-03-24
  • 2020-06-15
相关资源
最近更新 更多