假设我们有一个DateTime ArrayList,其中包含格式为yyyyMMddHHmmss的完整日期
ArrayList<DateTime> dt = new ArrayList<DateTime>();
dt.add("20160418220000");
dt.add("20160418213000");
dt.add("20160418210000");
dt.add("20160418203000");
如何在joda-time中仅打印尖锐的小时(如22:00)?
答案 0 :(得分:0)
您可以使用字段hourOfDay
的属性来应用floor-manipulation:
List<DateTime> dtListOld = dt; // your input
List<DateTime> dtListNew = new ArrayList<>();
for (DateTime dateTime : dtListOld) {
dtListNew.add(dateTime.hourOfDay().roundFloorCopy());
}
这些列表根据您上面的评论保留DateTime
- 对象。要进行格式化等进一步处理,您可以使用DateTimeFormatter
。为了与DateTime
的其他未定义实例进行比较,您可以使用常见的比较方法,例如isEqual()
(严格测试同一时刻的高峰时段)。
请注意,如果日期时间对象的来源是时钟(通常产生毫秒分数),那么在尖锐时刻测试严格的日期时间(时刻)相等可能是错误的。在这种情况下,您可以将类似的舍入模式应用于要比较的其他对象(但可能在分钟或二分之一基础上)。
比较示例:
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyyMMddHHmmss");
DateTime now = DateTime.now();
DateTime other1 = dtf.parseDateTime("20160418184137");
DateTime other2 = dtf.parseDateTime("20160418180000");
DateTime sharpHour = now.hourOfDay().roundFloorCopy();
if (!sharpHour.isEqual(other1.minuteOfDay().roundFloorCopy())) {
System.out.println("Not matching sharp hour: " + other1);
}
DateTime other2Floor = other2.minuteOfDay().roundFloorCopy();
if (sharpHour.isEqual(other2Floor)) {
System.out.println("Matching sharp hour: " + other2);
}
输出:
不匹配尖锐的小时:2016-04-18T18:41:37.000 + 02:00
匹配尖锐的小时:2016-04-18T18:00:00.000 + 02:00
使用地板四舍五入确保您不会忘记精度高于所需的零件。例如,像getMinuteOfHour() == 0
这样的查询/条件不会考虑可能的秒或毫秒偏离零。