【问题标题】:Is it possible to truncate date to Month with Java 8?是否可以使用 Java 8 将日期截断为月份?
【发布时间】:2015-08-26 20:06:05
【问题描述】:

我想将毫秒截断为天,我可以使用

Instant.now().truncatedTo(ChronoUnit.DAYS).toEpochMilli()

但我不能截断为ChronoUnit.MONTH(它会引发异常)。我需要使用a Calendar吗?

【问题讨论】:

    标签: java java-8 truncate java-time


    【解决方案1】:

    这就是java.time.temporal.TemporalAdjusters 的用途。

    date.with(TemporalAdjusters.firstDayOfMonth()).truncatedTo(ChronoUnit.DAYS);
    

    【讨论】:

      【解决方案2】:

      一种方法是手动将日期设置为每月的第一天:

      import static java.time.ZoneOffset.UTC;
      import static java.time.temporal.ChronoUnit.DAYS;
      
      ZonedDateTime truncatedToMonth = ZonedDateTime.now(UTC).truncatedTo(DAYS).withDayOfMonth(1);
      System.out.println(truncatedToMonth); //prints 2015-06-01T00:00Z
      long millis = truncatedToMonth.toInstant().toEpochMilli();
      System.out.println(millis); // prints 1433116800000
      

      或者使用LocalDate 的替代方案,这可能更简洁:

      LocalDate firstOfMonth = LocalDate.now(UTC).withDayOfMonth(1);
      long millis = firstOfMonth.atStartOfDay(UTC).toEpochSecond() * 1000;
      //or
      long millis = firstOfMonth.atStartOfDay(UTC).toInstant().toEpochMilli();
      

      【讨论】:

        【解决方案3】:

        我在使用瞬间时当然遇到了同样的问题,然后下面的代码解决了我的问题:

        Instant instant = Instant.ofEpochSecond(longTimestamp);
        instant = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()).with(TemporalAdjusters.firstDayOfMonth())
                    .truncatedTo(ChronoUnit.DAYS).toInstant();
        

        【讨论】:

          【解决方案4】:

          简单的方法:

          Calendar cal = new GregorianCalendar();
          System.out.println(cal.getTime());
          
          cal.set(Calendar.DAY_OF_MONTH,1);
          System.out.println(cal.getTime());
          
          cal.set(Calendar.HOUR_OF_DAY,0);
          System.out.println(cal.getTime());
          
          cal.set(Calendar.MINUTE,0);
          System.out.println(cal.getTime());
          
          cal.set(Calendar.SECOND,0);
          System.out.println(cal.getTime());
          
          cal.set(Calendar.MILLISECOND,0);
          System.out.println(cal.getTime());
          

          输出是:

          Thu Jun 11 05:36:17 EDT 2015
          Mon Jun 01 05:36:17 EDT 2015
          Mon Jun 01 00:36:17 EDT 2015
          Mon Jun 01 00:00:17 EDT 2015
          Mon Jun 01 00:00:00 EDT 2015
          Mon Jun 01 00:00:00 EDT 2015
          

          【讨论】:

          • 呃,这不简单,事实上这就是新的 Java 8 Dates API 的全部原因。
          • 有趣。这个答案是过去如何编写 java 日期操作代码的一个很好的例子。虽然看起来可能相当直截了当,但它并不完全优雅。所以请阅读和学习其他答案,不要再写这样的代码了。
          猜你喜欢
          • 1970-01-01
          • 2012-07-05
          • 2020-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-24
          • 2021-12-01
          相关资源
          最近更新 更多