【问题标题】:Getting the time and date now in 16 bits hexadecimal (16 characters)现在以 16 位十六进制(16 个字符)获取时间和日期
【发布时间】:2020-03-20 11:48:18
【问题描述】:

我正在使用

Calendar.getInstance().getTimeInMillis()/1000

以秒为单位获取日历中今天时间的结果。我需要将结果输出成这样的:

0000000ED76420A5

大端或小端无关紧要,但我的知识不足以转换它,我的朋友告诉我这与 Epoch 时间有关,但我不确定为什么我没有得到我转换时的正确日期时间。

我使用的偏移量为:62168515200,但我也不明白这些是什么意思。

我将不胜感激任何帮助或资源.. 谢谢。

编辑:我正在在线使用纪元时间转换器(截至目前为 1574669899),但是有了这个数字,我如何在 Java 中获得日期时间?如果我能够在 Java 中获得正确的日期时间,我也许可以进行转换,对吧?

【问题讨论】:

  • 获取纪元 -> 将其转换为十六进制表示形式 -> 将其发送到某处......另一方面,用于反序列化:将十六进制转换为长 -> 获取该纪元的日期...
  • @ΦXocę웃Пepeúpaツ谢谢,但我如何计算纪元?我需要什么?当前日期时间(以秒为单位)...还有什么?谢谢
  • 您使用繁琐的旧旧日期 API Calendar 而不是现代日期时间 API 是否有特定原因?
  • 你能用java 8吗???

标签: java date time epoch


【解决方案1】:

如果您有 Java 8,则使用 java.timeLong 的一些 static 方法以获得纪元毫秒的瞬间,将其转换为十六进制表示并反过来执行。最后,下面的例子展示了如何创建一个日期时间并打印出来:

public static void main(String[] args) {
    // take the instant in epoch milliseconds
    long millis = Instant.now().toEpochMilli();
    // print them once
    System.out.println("millis:\t\t\t" + millis);
    // convert them to a hexadecimal representation
    String hexMillis = Long.toHexString(millis);
    // print them
    System.out.println("Hex-Millis:\t\t" + hexMillis);
    // convert the millis back, THIS NEEDS A LEADING 0x
    long convertedMillis = Long.decode("0x" + hexMillis);
    // print the value and see that it's the same as above
    System.out.println("Converted millis:\t" + convertedMillis);
    // create an Instant from the converted millis
    Instant instant = Instant.ofEpochMilli(convertedMillis);
    // create a LocalDateTime from the Instant using the system default time zone
    LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    // print the date-time formatted
    System.out.println("LocalDateTime:\t\t" 
            + localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
}

在我的系统上,这个输出

Hex-Millis:         16ea1bbd03c
Converted millis:   1574671470652
LocalDateTime:      2019-11-25T09:44:30.652

【讨论】:

  • 非常感谢!我不确定,它不适用于早期的 Java 版本吗? :)
  • java.time 已被向后移植到 Java 6 和 7,因此它可以在那里工作。见threeten.org/threetenbp
  • @Ken 对于 Java 6 和 7,请参阅 @OleVV 的评论,对于古董版本,您需要依赖 java.util...
  • 对于 Java 8 及更高版本java.time 是内置的,Android 26+ 也是如此。对于 Java 6 和 7,请参阅 ThreeTen-Backport。对于 26 之前的 Android,请使用 ThreeTenABP,它是该 Java 反向端口的包装器。对于 Java 5,请使用 java.time 的前身 Joda-Time 版本 2。对于 Java 4,请使用 Joda-Time 版本 1。
【解决方案2】:

按要求截断秒数:

    long t = ZonedDateTime.now().toEpochSecond();
    String s = String.format("%016X", t);
    System.out.println(s);
    Instant instant = Instant.ofEpochSecond(t);
    ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
    System.out.println(zonedDateTime);

000000005DDB955A
2019-11-25T09:48:26+01:00[Europe/Maastricht]

对于旧类日期、日历:

long t = new Date().getTime(); // ms

格式 %16x 表示没有前导 0,并且用 a-f 代替 A-F。

当然,存储 ms 甚至 ns 也是有意义的。查看@deHaar的解决方案

【讨论】:

  • 我看到的大多数示例都与您的相似,它们都以许多零开头,然后是 16 位格式的十六进制。我想知道 deHaar 的解决方案和你的解决方案有什么区别? @deHaar 的解决方案是基于更高版本的 Java 吗?
  • @deHaar 只是使用了更好的精度(不仅仅是秒),并丢弃了许多前面的零。我们都使用新的 java 时间类,DateCalendar 是旧方法。可以考虑为国际使用一个独立于时区的时间,ZoneId.of("Z")"UTC"。我也给出了答案,只是因为 s/ms 的因子 1000 给出了不同的值。
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
  • 2021-08-24
  • 2020-01-18
相关资源
最近更新 更多