我一直试图对犯罪列表进行排序,并将对象分类为白天和夜间列表 . 所以白天可以在早上6点到晚上10点之间,晚上时间可以在晚上10点到早上6点之间 . 我写了一个if语句试图填写一系列夜间犯罪 .
if(data.getDate().getHours() < 6 && data.getDate().getHours() > 22) {
System.out.println(data.getDate().toLocaleString());
nightCrimes.add(data);
}
虽然没有打印出来但列表仍然是空的 . 我注意到逻辑显然是错误的,因为一个特定的整数(小时)不能超过22且小于6.有没有更好的方法来解决这个问题?
2 回答
您需要更改的唯一内容是将&&替换为|| . 这是新的if语句
tl;博士
正如George Fox所说的那样,你问题的直接答案是使用逻辑OR而不是AND .
但是您的代码还有其他问题:
忽略 time zone 的关键问题
使用血腥 awful date-time classes ,现在已经过时了 .
代码段:
...(等于或大于22)或(小于6)=夜间值 .
java.time
显然你正在使用可怕的旧日期时间类,推断你对
getHours
的调用是java.util.Date::getHours .几年前,业界领先的java.time类取代了这些遗留类 .
顺便说一句,
Date::getHours
也被弃用了 .时区
如果您正在使用
java.util.Date
,那么您忽略了时区的关键问题 .Date
表示UTC中的时刻,根据定义始终为UTC .因此,除非您居住在冰岛,否则请求UTC中的当天时间与您当地的白天和黑夜时间不符 .
首先将您的
Date
转换为现代java.time.Instant . 为此,您可以使用添加到旧类的新方法 .然后为您所在地区应用时区,以获得ZonedDateTime .
以
continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
. 切勿使用2-4字母缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!) .比较您的问题中的时间 .
您可以将它们收集到
Map
中,其中键是字符串“nighttime”或“daytime”,值是Set
的Crime
对象 .Set
消除了重复 . 如果您想要对犯罪进行排序,请使用SortedSet
.搜集 .
让我们接下来将该代码转换为使用时间而不是一天中的时间,以防您的业务规则被重新定义为部分小时 .
通常使用半开放方法最好地定义时间 Span . 开头是包容性的,而结尾是独家的 . 因此,夜晚时间从晚上10点的第一个时刻开始,一直持续到但不包括上午6点的第一个时刻 .
提示:询问“是否等于或晚于晚上10点”的较短方式是“如果不是之前
关于java.time
java.time框架内置于Java 8及更高版本中 . 这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date,Calendar和SimpleDateFormat .
现在位于maintenance mode的Joda-Time项目建议迁移到java.time类 .
要了解更多信息,请参阅Oracle Tutorial . 并搜索Stack Overflow以获取许多示例和解释 . 规格是JSR 310 .
您可以直接与数据库交换java.time对象 . 使用JDBC driver符合JDBC 4.2或更高版本 . 不需要字符串,不需要
java.sql.*
类 .从哪里获取java.time类?
Java SE 8,Java SE 9,Java SE 10,Java SE 11和更高版本 - 带有捆绑实现的标准Java API的一部分 .
Java 9增加了一些小功能和修复 .
Java SE 6和Java SE 7
大多数java.time功能都在ThreeTen-Backport中反向移植到Java 6和7 .
Android
更新版本的Android捆绑java.time类的实现 .
对于早期的Android(<26),ThreeTenABP项目适应ThreeTen-Backport(如上所述) . 见How to use ThreeTenABP… .
ThreeTen-Extra项目使用其他类扩展了java.time . 该项目是未来可能添加到java.time的试验场 . 您可以在这里找到一些有用的类,例如Interval,YearWeek,YearQuarter和more .