【问题标题】:Fast way to get the current Calendar object in Java在 Java 中获取当前 Calendar 对象的快速方法
【发布时间】:2015-05-04 19:05:02
【问题描述】:

如果一个方法需要在每次调用时使用当前日/月/年的值,并且每秒调用数次(数百万或更多)次,除了创建每次调用当前时间的 Calendar 对象?

使用Calendar.getInstance()calendar.setTime()(使用时间字段重新计算)每秒执行多次操作过于昂贵。

标准 Java 解决方案更可取(例如,优于使用第三方库)。

【问题讨论】:

  • 废话。这是一个纳米优化,我敢肯定你无法测量。您的其余代码可能效率低得多。分析您的代码并解决大问题。在您有数据表明这是一个大问题之前,请不要为此烦恼。
  • 就像 duffymo 说的,你有实际数据支持这个理论吗?
  • 也许您应该发布“每秒多次”。代码
  • Calendar.getInstance() 方法在特定测试系统中每秒可实现大约 1,000,000 到 2,000,000 次调用。有些用例每秒需要比这些数字更多的调用。

标签: java time calendar


【解决方案1】:

要获取当前日期/时间,我发现LocalDate.now()Calendar.getInstance() 快。 LocalDate 类可以在 java.time 包中找到,这是自 Java 8 以来的新内容(当然,如果您想保持与旧 Java 版本的兼容性,那可能不是一个选择)。

【讨论】:

  • 您会发现整个 java.time 包的使用要比尝试操作日历实例要容易得多。
  • 我赞成LocalDate 的提示,尽管我在回答中给出了不同的理由。
【解决方案2】:

标准 java 范围内的最佳解决方案(没有第 3 方库)是使用类 LocalDate。到目前为止,这个答案与@Chronio 的答案相同,但我在使用上有所不同。工厂方法now() 不能这么快,因为它利用了系统时区——甚至可能在TimeZone.getDefault() 深度的任何地方使用同步方法。

但是LocalDate 类如果使用带有年、月和日参数的工厂方法会非常快。在这里,您只是在没有任何时区计算且没有任何公历数学计算的情况下设置州成员(好吧,只涉及快速的与年份相关的月份长度检查)。看看源代码就行了。

【讨论】:

    【解决方案3】:

    使用日期,而不是日历类,它将为您提供当前日期

    【讨论】:

    • Date 类被标记为已弃用,不应使用。改用 Java 8 中引入的 LocalDate。
    猜你喜欢
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2016-02-04
    • 2013-09-02
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多