tl;博士
Interval.of(
Instant.ofEpochMilli( 1_412_801_340_000L ) , // 2014-10-08T20:49:00Z
Instant.ofEpochMilli( 1_412_808_540_000L ) // 2014-10-08T22:49:00Z
).contains(
Instant.ofEpochMilli( 1_447_195_740_000L ) // 2015-11-10T22:49:00Z
)
假
java.time
如果您希望将这些值视为 UTC 中的日期时间,那么现代方法使用 java.time 类来取代麻烦的旧 Date 和 Calendar 类。 p>
Instant
Instant 类表示UTC 中时间轴上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。
样本数据错误/歧义
顺便说一句,您对自 1970 年 UTC 开始以来的毫秒数示例的日期时间描述不正确。请参阅下面的输出。您似乎有一个影响您的数字的偏移量,前两个偏移量为 4 小时,最后一个偏移量为 5 小时,这可能是由于夏令时 (DST) 的“后备”变化。这说明了为什么将时间作为从 epoch 开始的计数是一个糟糕的想法,充满了歧义和未捕获错误的问题。我建议始终使用标准的ISO 8601 格式将这些时刻序列化为文本。
Instant start = Instant.ofEpochMilli( 1_412_801_340_000L ); // 2014-10-08T20:49:00Z (not 10/8/14 4:49 PM in UTC time)
Instant stop = Instant.ofEpochMilli( 1_412_808_540_000L ); // 2014-10-08T22:49:00Z (not 10/8/14 6:49 PM in UTC time)
Instant test = Instant.ofEpochMilli( 1_447_195_740_000L ); // 2015-11-10T22:49:00Z (not 11/10/15 5:49 PM in UTC time)
看到code run live at IdeOne.com。
start.toString(): 2014-10-08T20:49:00Z
stop.toString(): 2014-10-08T22:49:00Z
test.toString(): 2015-11-10T22:49:00Z
比较
将Instant 对象与isBefore、isAfter 和equals 进行比较。
通常,处理时间跨度的最佳方法称为半开放式,其中开头是包含,结尾是排他。因此,例如,一天从一天的第一刻开始,一直持续到但不包括第二天的第一刻。
boolean isTestWithinRange =
( test.equals( start ) || test.isAfter( start ) )
&&
test.isBefore( stop )
;
询问“等于或晚于”的更简短的方式是“不早于”。
boolean isTestWithinRange =
( ! test.isBefore( start ) )
&&
test.isBefore( stop )
;
甚至更短,使用ThreeTen-Extra 项目中的org.threeten.extra.Interval 类,您可以将这个库添加到您的Java 项目中。不确定这是否适用于 Android。
Interval interval = Interval.of( start , stop ) ;
boolean isTestWithinRange = interval.contains( test ) ;
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
使用符合JDBC 4.2 或更高版本的JDBC driver,您可以直接与您的数据库交换java.time 对象。不需要字符串或 java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。