java - 如何获取上周一凌晨 2-00 点?

标签 java date time jodatime

我使用的是 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.   |
______________________________________________________________|_____________|

因此,我需要返回第 1 周的星期一凌晨 2 点至 00 点。 当且仅当当前时间介于第 1 周的星期一上午 2-00 点和第 2 周的星期一上午 2-00 点之间周一凌晨 2-00 点

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

最佳答案

首先是 Joda-Time 中的解决方案。二、新中的类似解决方案java.time Java 8 及更高版本中内置的框架,旨在作为 Joda-Time 的继承者。请参阅Tutorial .

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

  1. 通过使用 LocalDateTime.minus 减去一周中的某一天和周一之间的差异来获取上周一的当前时间方法
  2. 减去今天的毫秒数即可到达周一上午 00:00
  3. 使用 LocalDateTime.plus 添加 2 小时方法。

Joda Time

    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 - 如何获取上周一凌晨 2-00 点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33840236/

相关文章:

java - 可观察超时

java - Java 中用于日志分析应用程序的数据库 - 2014

ios - Truetime iOS Framework 出现超时错误

java - 如何更改 1970-01-01T00 :00:00Z for LocalDateTime 的默认纪元

java - 如何计算字符串中字母文字的数量?

Java短路CompletableFuture

mysql - 将 MySQL 字符串转换为时间

php - 从两个日期计算月份

http - 网站上的图片数量导致加载时间过长

python - 将列表转换为数据框时如何优化时间?