【问题标题】:Easy and fast way to format a timestamp格式化时间戳的简单快捷方式
【发布时间】:2014-12-20 10:01:43
【问题描述】:

自纪元以来,我们有一些以毫秒为单位的时间戳。在用于日志记录、异常或toString() 方法的字符串中,需要对这些时间戳进行格式化。一个简单干净的格式就足够了。

那么,在 Java 中格式化时间戳最简单、最快的方法是什么?

要求:

  • 输入时间戳表示为自纪元以来的毫秒数
  • 输出应该是一个字符串
  • 低 CG 开销
  • 简单而干净的输出就足够了,因为它仅用于内部目的(调试和日志记录),例如最小的东西:20141220 174522.23
  • 如果可能在 JDK 中
  • 时区为系统时区

特别是,有人做过可用于此的 JDK 方法的基准测试吗?

实际上我不想使用 SimpleDateFormat,因为我认为它的灵活性会带来太多开销。

【问题讨论】:

  • 你用谷歌搜索过吗?你准备好任何你可以在这里使用的类了吗?您是否尝试过使用这些类?您的观察结果是什么?
  • 刚刚澄清 SimpleDateFormat 不是我想要的。这就是标准的“巨无霸”解决方案。

标签: java performance datetime formatting timestamp


【解决方案1】:

易于使用且合理快速:

// All Java versions:
new java.sql.Timestamp(millis).toString(); // 2016-10-29 12:28:41.979

// Recommended when using Java 8+ (about +50% faster than Timestamp), standards compliant format
// checked with jmh 1.15
java.time.Instant.ofEpochMilli(millis).toString(); // 2016-10-29T10:28:41.979Z

【讨论】:

  • 你是怎么得到millis的?
【解决方案2】:

最快的实现很可能是:

Long.toString(millis);

如果性能是最重要的,你应该使用它。

实际上我不想使用 SimpleDateFormat,因为我认为它的灵活性会带来太多开销。

根据快速的jmh 基准测试,在我的笔记本电脑上,Long.toString 获得 1200 万次操作/秒,SimpleDateFormat 是 200 万次。

您的预算是多少?一旦您知道您将能够决定其中哪一个最合适。

【讨论】:

    【解决方案3】:

    Apache Commons Lang 的FastDateFormat 类绝对是SimpleDateFormat 的一个很好的替代品。它快速且线程安全(在多线程服务器环境中特别有用)。所有模式都与SimpleDateFormat 兼容(时区和某些年份模式除外)。

    构造函数的总结是:

    FastDateFormat(String pattern, TimeZone timeZone, Locale locale)

    您可以在 FastDateFormat找到更多信息

    【讨论】:

      【解决方案4】:

      试试:

      Calendar calendar = Calendar.getInstance();
      calendar.setTimeInMillis(timeStamp);
      

      或者:

      Date date = new Date(milliseconds);
      

      不确定哪个更快。

      要将日期格式化为字符串,可以使用 SimpleDateFormat:

      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HHmmss.SSS"); // should output something like you desired: 20141220 174522.23
      String formattedDate = sdf.format(date); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-17
        • 1970-01-01
        • 2016-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多