代码之家  ›  专栏  ›  技术社区  ›  gavenkoa

哪个接口声明truncatedTo()Java 8 date API?

  •  1
  • gavenkoa  · 技术社区  · 7 年前

    我想编写将当前日期截断到下一个午夜(00:00:00)的通用实现。它应该在 LocalDateTime ZonedDateTime :

    td.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)
    

    问题是我找不到声明 truncatedTo 方法

    有没有其他方法可以通用地实现这个功能?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Jens Hoffmann    7 年前

    你会看到 documentation 如果 truncatedTo​(TemporalUnit unit) 方法已在某个接口中声明。

    你可以回到Temporal的 with(TemporalAdjuster adjuster) 一般来说:

    private static <T extends Temporal> T roll(T t) {
        return (T) t.plus(1, ChronoUnit.DAYS).with(LocalTime.MIN);
    }
    

    你必须仔细检查你的需求,看这是否适合你。

    另一种选择是 方法重载 处理这两个问题 LocalDateTime ZonedDateTime 至少具有相同的方法名称:

    private static LocalDateTime roll(LocalDateTime t) {
        return t.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS);
    }
    
    private static ZonedDateTime roll(ZonedDateTime t) {
        return t.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS);
    }
    
        2
  •  3
  •   Anonymous    7 年前

    不,您不能很容易地通用地实现此函数。没有接口指定 truncatedTo 方法而且 LocalDateTime.truncatedTo() 返回a LocalDateTime 而在 ZonedDateTime 返回a(您已经知道) 分区DateTime .

    共有六个班级 截断为 方法 Instant , LocalTime , OffsetDateDateTime OffsetTime 也有。在所有情况下,该方法都会再次返回相同的类型。

    使用泛型可能会使通用性更加明确。我听说斯蒂芬·科尔伯恩是 java.time ,不喜欢泛型,而且在任何情况下,API中都没有泛型。

    许多其他方法在几个日期时间类中使用相同的名称,而没有在公共接口中指定,如 format , getDayOfMonth , isAfter 以及 withXx 方法。

    也许可以使用反射实现通用函数,但您不希望这样。