java - joda-time DateTime.with*() 的性能问题

标签 java performance jodatime

有没有快速创建 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/

相关文章:

java - 使用 Joda 时间求和持续时间

java - 序列化和反序列化 Joda DateTime 对象

java - 尝试在 Android Activity 中执行简单命令时出错

java - java列表中的addAll方法

java - Selenium xPath - 通过部分文本定位元素

python - 为什么 Django 使用元组的元组来存储静态字典,我应该这样做吗?

performance - 渐进式渲染和 SEO

java - 当我有一个用于相同目的的网站(php)时通过应用程序登录

performance - Qt 与 GTK+ 性能

java - Joda Time 错误还是我的错误? (Java Joda Time 日期作为字符串解析)