如何在joda-time中获得大幅度的时间

时间:2016-04-18 14:20:35

标签: java datetime arraylist time jodatime

假设我们有一个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)?

1 个答案:

答案 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这样的查询/条件不会考虑可能的秒或毫秒偏离零。