tl;博士
ChronoUnit.DAYS.between( // Total count of days.
LocalDate.of( 2018 , Month.JANUARY , 23 ) , // Represent a certain date.
LocalDate.now( ZoneId.of( "America/Montreal" ) ) // Determine today’s current date for a particular region (time zone).
)
java.time
旧的 Date 类现在已被 java.time 类所取代。并且将日期时间跟踪为自纪元以来的毫秒数是令人沮丧且容易出错的。
将您的Date 对象转换为Instant。如果使用更高版本的 Android,请寻找添加到旧类的新方法。对于早期的 Android,请使用 ThreeTen-Backport 和 ThreeTenABP 项目的实用程序类进行转换。
Instant 类表示UTC 中时间轴上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。
因为Instant 始终采用UTC,您需要调整到时区。时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜过后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。
以continent/region 的格式指定proper time zone name,例如America/Montreal、Africa/Casablanca 或Pacific/Auckland。切勿使用 3-4 个字母的伪时区,例如 EST 或 IST,因为它们不是真正的时区,没有标准化,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
申请您的Instant 以获得ZonedDateTime。
ZonedDateTime zdt = instant.atZone( z ) ;
如果您只关心由日期定义的整天,请提取 LocalDate 对象。
LocalDate localDate = zdt.toLocalDate() ;
获取其他日期,例如今天。
LocalDate today = LocalDate.now( z ) ;
使用ChronoUnit枚举计算经过的总天数。
long days = ChronoUnit.DAYS.between( localDate , today ) ;
如果您想要计算年、月和日,请使用 Period 类。
Period p = Period.between( localDate , today ) ;
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?