如何使方法通用以使用LocalDate和LocalDateTime?

Aje*_*mar 1 polymorphism java-8 jsr310 java-time

我有一个Java方法如下:

private static boolean isDateBetweenRange(DataSet obj, MyClass dataSource, ConditionContext context) {
    FilterContext fc = dataSource.getData();

    LocalDate dateFieldToCheck = obj.getDate(fc.getDateField()).toInstant()
                                   .atZone(ZoneId.systemDefault()).toLocalDate();
    LocalDate minDate = fc.getMinDateValue();
    LocalDate maxDate = fc.getMaxDateValue();

    if (minDate == null || maxDate == null) {
        minDate = context.getStartDate().toInstant().atZone(ZoneId.systemDefault())
                    .toLocalDate();
        maxDate = context.getEndDate().toInstant().atZone(ZoneId.systemDefault())
                    .toLocalDate();
    }

    boolean result = (dateFieldToCheck.isAfter(minDate) || dateFieldToCheck.isEqual(minDate))
            && (dateFieldToCheck.isBefore(maxDate) || dateFieldToCheck.isEqual(maxDate));

    return result;
}
Run Code Online (Sandbox Code Playgroud)

我也想做同样的逻辑LocalDateTime.LocalDateTime如果我重载方法,它将是完全相同的代码.

如何使该方法通用,LocalDateLocalDateTime使用泛型或任何其他机制?

我如何根据我的类型制作context.getXXXDate()... toLocalDate()toLocalDateTime()使用通用代码?

Jod*_*hen 5

TemporalAccessor接口可用于执行此操作.但是,请注意,这TemporalAccessor是一个不应在低级实用程序代码之外使用的高级接口.

boolean api(TemporalAccessor temporal1, TemporalAccessor temporal2) {
  LocalDate date1 = LocalDate.from(temporal1);
  LocalDate date2 = LocalDate.from(temporal2);
  return ...;
}
Run Code Online (Sandbox Code Playgroud)

此代码现在会接受LocalDate,LocalDateTime,OffsetDateTimeZonedDateTime.

正如评论中所提到的,仅ZoneId.systemDefault()在一个业务逻辑中调用一次是至关重要的,因为价值可能会发生变化.