【问题标题】:How to get last week and last month with java8如何用java8获取上周和上个月
【发布时间】:2018-07-16 07:11:16
【问题描述】:

我有一个日期,我需要知道日期之前的最后一周和上个月。

例如,

2018 年 7 月 15 日,最后一周为 7 月 2 日至 7 月 8 日。最后一个月为 6 月 1 日至 6 月 30 日。

2018 年 7 月 16 日,最后一周为 7 月 9 日至 7 月 15 日。最后一个月为 6 月 1 日至 6 月 30 日。

2018 年 7 月 17 日,最后一周为 7 月 9 日至 7 月 15 日。最后一个月为 6 月 1 日至 6 月 30 日。

get-date-of-first-day-of-week-based-on-localdate-now-in-java-8不一样,我的问题是上周或者上个月拿到的。

【问题讨论】:

标签: java datetime java-8


【解决方案1】:

您可以使用这些辅助方法。

public static LocalDate[] getPreviousWeek(LocalDate date) {
    final int dayOfWeek = date.getDayOfWeek().getValue();
    final LocalDate from = date.minusDays(dayOfWeek + 6); // (dayOfWeek - 1) + 7
    final LocalDate to = date.minusDays(dayOfWeek);

    return new LocalDate[]{from, to};
}

public static LocalDate[] getPreviousMonth(LocalDate date) {
    final LocalDate from = date.minusDays(date.getDayOfMonth() - 1).minusMonths(1);
    final LocalDate to = from.plusMonths(1).minusDays(1);

    return new LocalDate[]{from, to};
}

实际上有很多方法可以写这个。我建议你自己做一些探索。

【讨论】:

    【解决方案2】:

    您可以使用 Java 8 LocalDate 轻松做到这一点,这是我的解决方案:

    import java.time.LocalDate;
    
    LocalDate now = LocalDate.now();
    LocalDate weekStart = now.minusDays(7+now.getDayOfWeek().getValue()-1);
    LocalDate weekEnd = now.minusDays(now.getDayOfWeek().getValue());
    
    LocalDate previousMonth = now.minusMonths(1);
    LocalDate monthStart = previousMonth.withDayOfMonth(1);
    LocalDate monthEnd = previousMonth.withDayOfMonth(previousMonth.getMonth().maxLength());
    
    System.out.println("WeekStart:"+weekStart+", weekEnd:"+weekEnd+", monthStart:"+monthStart+", monthEnd:"+monthEnd);
    

    结果

    WeekStart:2018-07-09, weekEnd:2018-07-15, monthStart:2018-06-01, monthEnd:2018-06-30

    如果你改变现在的行

    LocalDate now = LocalDate.of(2018,07,15);
    

    你会得到:

    WeekStart:2018-07-02, weekEnd:2018-07-08, monthStart:2018-06-01, monthEnd:2018-06-30

    【讨论】:

      【解决方案3】:

      ZonedDateTime 对此很有用。

      import java.time.*;
      import java.time.format.DateTimeFormatter;
      
      class DateTest
      {
          public static void main (String[] args) throws java.lang.Exception
          {
              DateTimeFormatter format = DateTimeFormatter.ofPattern("dd MMM yyyy");
              ZoneId usCentral = ZoneId.of("America/Chicago");
              LocalDateTime localDateTime = LocalDateTime.of(2018, Month.JULY, 16, 9, 30);
      
              ZonedDateTime input = ZonedDateTime.of(localDateTime, usCentral);
              System.out.println("Input date = " + format.format(input));
      
              ZonedDateTime startDate = input.minusWeeks(1).with(DayOfWeek.MONDAY);
              System.out.println("Start date = " + format.format(startDate));
      
              ZonedDateTime endDate = startDate.plusDays(6);
              System.out.println("End date = " + format.format(endDate));
          }
      }
      

      输出:

      Input date = 16 Jul 2018
      Start date = 09 Jul 2018
      End date = 15 Jul 2018
      

      【讨论】:

      • 我想说 LocalDate 更有用,只专注于你需要的东西,避免很多你不需要的东西。
      【解决方案4】:

      不确定你是否得到了一个 Date 对象,希望你得到了。 从日期对象中,您可以使用 toInstant() 方法获取 Instant (将字符串传递到日期..

      DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
      Date date = format.parse(string);
      

      日期格式当然必须根据您的需要而定 )

      Instant.now().minus(Duration.ofDays(7))); // last week
      Instant.now().minus(Duration.of(1,ChronoUnit.MONTHS)) // last month
      

      【讨论】:

      • 不应使用旧的 Java Date API
      • 请不要教年轻人使用早已过时且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API 和它的DateTimeFormatter 中做得更好。
      • 感谢您也尝试使用 java.time。但是你的最后一行抛出java.time.temporal.UnsupportedTemporalTypeException: Unit must not have an estimated duration
      猜你喜欢
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多