【问题标题】:Java time since the epoch自纪元以来的Java时间
【发布时间】:2012-08-05 22:52:00
【问题描述】:

在 Java 中,如何以以下格式打印出以秒和纳秒为单位的纪元以来的时间:

java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

我的输入是:

long mnSeconds;
long mnNanoseconds;

其中两者之和是自纪元1970-01-01 00:00:00.0以来经过的时间。

【问题讨论】:

  • 看到这个question,你应该可以根据需要修改它

标签: java time simpledateformat epoch


【解决方案1】:

用这个除以 1000

long epoch = System.currentTimeMillis();

System.out.println("Epoch : " + (epoch / 1000));

【讨论】:

  • 这显示自纪元以来的 当前 秒。跑题了。
  • 是的,我出于某种原因完全误读了这个问题,以为他在问几秒钟。
  • 完全同意这是题外话,但这是我正在寻找的,第一个结果是在这里。我的查询是 Java 纪元时间,我的目标是获取当前纪元时间
【解决方案2】:

tl;博士

    Instant                        // Represent a moment in UTC.
    .ofEpochSecond( mnSeconds )   // Determine a moment from a count of whole seconds since the Unix epoch of the first moment of 1970 in UTC (1970-01-01T00:00Z). 
    .plusNanos( mnNanoseconds )    // Add on a fractional second as a count of nanoseconds. Returns another `Instant` object, per Immutable Objects pattern.
    .toString()                    // Generate text representing this `Instant` object in standard ISO 8601 format.
    .replace( "T" , " " )          // Replace the `T` in the middle with a SPACE. 
    .replace "Z" , "" )            // Remove the `Z` on the end (indicating UTC).

java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了旧的麻烦的日期时间类,例如java.util.Date.Calendarjava.text.SimpleDateFormatjava.sql.Date 等。 Joda-Time 团队还建议迁移到 java.time。

Instant

Instant 类代表 UTC 时间轴上的一个时刻,分辨率高达纳秒。

long mnSeconds = … ;
long mnNanoseconds = … ;

Instant instant = Instant.ofEpochSecond( mnSeconds ).plusNanos( mnNanoseconds );

或者将两个数字作为两个参数传递给of。不同的语法,相同的结果。

Instant instant = Instant.ofEpochSecond( mnSeconds , mnNanoseconds );

要获取表示此日期时间值的字符串,请调用 Instant::toString

String output = instant.toString();

您将获得一个值,例如2011-12-03T10:15:30.987654321Z,标准ISO 8601 格式。如果您愿意,请将T 替换为空格。对于其他格式,请搜索 Stack Overflow 以了解 DateTimeFormatter


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案3】:

    你可以这样做

    public static String format(long mnSeconds, long mnNanoseconds) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.");
        return sdf.format(new Date(mnSeconds*1000))
               + String.format("%09d", mnNanoseconds);
    }
    

    例如

    2012-08-08 19:52:21.123456789
    

    如果你真的不需要超过毫秒,你可以做

    public static String format(long mnSeconds, long mnNanoseconds) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        return sdf.format(new Date(mnSeconds*1000 + mnNanoseconds/1000000));
    }
    

    【讨论】:

    • 这就是我会做的,只是他想要的格式输出不超过毫秒 (.SSS),所以最后一次 String.format() 调用有点不受欢迎。
    • 很好的答案——而且速度很快!谢谢。 Fredrik,它确实做 ms - 这就是 + String.format("%09d", mnNanoseconds);部分可以!
    • @user1585643 你错过了我的意思。那部分做毫秒和微米和纳米。问题中的格式字符串只有毫秒(三位小数),所以我认为这就是您想要的,而不是九位小数。
    • @user1585643 不清楚你想要毫秒、微秒还是纳秒。这些根本不是一回事。顺便说一句,我倾向于在我的系统中记录和显示微秒,因为要获得比这更准确的东西非常困难。
    【解决方案4】:

    这在一定程度上取决于您的 mnSeconds 和 mnNanoseconds 的值,但是您需要使用像这样的格式化程序(具有毫秒精度)来创建一个 java.util.Date。如果 mnNanoseconds 是您的 mnSeconds 之上的纳秒数,我会假设它类似于

    Date d = new Date(mnSeconds*1000+mnNanosecods/1000000)

    然后在打印之前使用格式化程序对其进行格式化。

    【讨论】:

      【解决方案5】:

      java.util.Date 类有一个接受纪元毫秒的构造函数。

      检查java doc并尝试使用它。

      【讨论】:

      • java.util.Date 可能是更好的解决方案,因为 java.sql.Date 用于 jdbc 数据库。
      【解决方案6】:

      你可以使用

      new java.util.Date(mnSeconds);
      

      然后SimpleDateFormat 格式化您的输出。

      日期不支持纳秒。您必须手动添加纳秒或使用某些框架(有吗?)。

      【讨论】:

      • OP 只需要几毫秒,java.util.Date 确实支持这一点。不需要额外的框架。
      猜你喜欢
      • 2013-03-26
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 2019-12-04
      • 2016-05-14
      • 1970-01-01
      • 2010-11-24
      相关资源
      最近更新 更多