首先您必须决定是否要考虑一天中的时间和时区来计算差异,因为这会导致不同的结果。
示例:当前日期(也称为“今天”)是 4 月 17 日或 18 日,具体取决于您在世界的哪个地方。实际上,根据一天中的时间,世界上可能同时存在 3 个不同的“今天”。您使用哪个时区来计算差异?
- 用户将输入一个日期:只有日、月和年?会进入营业时间吗?您使用的是用户设备的时区还是某个特定时区?
- 同样的问题适用于当前日期
根据您所做的选择,您可能会得到不同的结果。
无论如何,我会使用这个库:http://www.threeten.org/threetenbp/
或 java.time 类,如果在您的 API 级别可用。在这两个 API 中,您都可以使用以下内容。
要使用日期(仅限日-月-年)和设备的默认时区,我会选择 LocalDate 类:
// current date in device's default timezone
LocalDate now = LocalDate.now();
// some date from input values (May 10th 2018)
LocalDate dt = LocalDate.of(2018, 5, 10);
// difference in days
long diff = ChronoUnit.DAYS.between(now, dt); // 23
如果您想考虑一天中的时间(小时、分钟等),请使用LocalDateTime。但在这种情况下,ChronoUnit.DAYS 认为时间 >= 另一天已经过去(例如:4 月 17 日上午 10 点和 4 月 18 日上午 9:59 之间的差异是零天,因为一天中的时间没有'没有达到上午 10 点,所以它没有完成 1 天 - LocalDate 这不会发生,因为这个类没有时间字段并且只考虑日、月和年)。
如果您想考虑所有内容(日期、时间和时区),包括夏令时转换,请改用ZonedDateTime(代码非常相似,唯一的区别是您可以选择使用的时区):
// current date/time in device's default timezone
ZonedDateTime now = ZonedDateTime.now(ZoneId.systemDefault());
// some date from input values (May 10th 2018, 10 AM in New York timezone)
ZonedDateTime dt = ZonedDateTime.of(2018, 5, 10, 10, 0, 0, 0, ZoneId.of("America/New_York"));
// difference in days
long diff = ChronoUnit.DAYS.between(now, dt); // 23
您可以在设备的默认时区 (ZoneId.systemDefault()) 或特定时区 (ZoneId.of("America/New_York")) 之间进行选择。您可以使用ZoneId.getAvailableZoneIds() 查看所有可用时区。
也许在一个时区使用当前日期并在另一个时区使用用户的日期是没有意义的(我对两者都使用相同的日期),但这由您决定。