如何在 joda-time 中只获得尖锐的时间
How to get only sharp hours in joda-time
假设我们有一个 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)?
您可以使用字段 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);
}
输出:
Not matching sharp hour: 2016-04-18T18:41:37.000+02:00
Matching sharp hour: 2016-04-18T18:00:00.000+02:00
使用floored rounding确保您不会忘记精度高于所需的部分。例如,像 getMinuteOfHour() == 0
这样的 query/condition 不会考虑可能偏离零的秒数或毫秒数。
假设我们有一个 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)?
您可以使用字段 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);
}
输出:
Not matching sharp hour: 2016-04-18T18:41:37.000+02:00
Matching sharp hour: 2016-04-18T18:00:00.000+02:00
使用floored rounding确保您不会忘记精度高于所需的部分。例如,像 getMinuteOfHour() == 0
这样的 query/condition 不会考虑可能偏离零的秒数或毫秒数。