有没有快速创建 DateTime 实例并将分\秒\毫秒设置为 0 的方法? 目前我正在使用以下代码:
private DateTime createDateTime(java.util.Date date, org.joda.time.Chronology chronology) {
DateTime dateTime = new DateTime(date, chronology);
dateTime = dateTime.withMinuteOfHour(0);
dateTime = dateTime.withSecondOfMinute(0);
dateTime = dateTime.withMillisOfSecond(0);
return dateTime;
}
但是当它调用大约 200.000 次时,dateTime.with***(0);需要很多时间。可能有更正确的解决方案?
最佳答案
大概是这样的?
// Truncate minutes/seconds/milliseconds from the date's timestamp
long truncatedTimestamp = date.getTime() - date.getTime() % 3600000;
DateTime dateTime = new DateTime(truncatedTimestamp, chronology);
为什么这样更快?
- 我的解决方案在
DateTime
构造函数中使用快速整数运算(可忽略不计)和 1 个 unix 时间戳标准化(昂贵) - 您的解决方案在
DateTime
构造函数中使用 1 个 unix 时间戳规范化(昂贵的)和 3 个更多的规范化(昂贵的),每次您将某个日期部分设置为0
< - 其他解决方案可能需要更少的代码行,但是当您查看 JodaTime 源代码时,它们甚至需要 3 次以上的规范化(昂贵)
因此,您可能无法击败模数。 正如其他人指出的那样,这可能会在非常遥远的极端情况下导致不正确的结果,其中小时数不算 60 秒(例如,由于闰秒),尽管我看不出如何,因为 unix 时间戳总是可以被截断为零, 获取日历小时的开始(欢迎提供示例)。
关于java - joda-time DateTime.with*() 的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9992147/