【问题标题】:Java Date to millisecondsJava 日期到毫秒
【发布时间】:2012-06-14 10:55:57
【问题描述】:

我正在存储来自亚马逊云的消息,并在排序后的地图中按时间戳对它们进行排序。

我正在使用以下代码从云端解析时间戳:

Date timestamp = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS'Z'", Locale.ENGLISH).parse(time);

然后我将它们存储在排序的地图中,键是日期。 问题是日期只能归结为秒精度。 我可以在 1 秒内发送多条消息,因此我需要以毫秒精度对它们进行排序。是否有允许这样做的数据结构?

【问题讨论】:

  • 你的格式是SSS 所以millis必须在那里
  • 如果 time 包含 UTC 时区 (Z),请使用 yyyy-MM-dd'T'hh:mm:ss.SSSZ 而不是 yyyy-MM-dd'T'hh:mm:ss.SSS'Z'Z抓住 Z 以及例如+0100
  • 请打印timestamp.getTime()
  • 您能否举一个您将使用的时间值time 的示例?谢谢。

标签: java date time amazon-web-services


【解决方案1】:

只要您的来源具有高于 1 秒的分辨率。从模式看起来像这样,但您没有向我们展示任何输入示例。

Date 只是自 1970-01-01 以来 long 毫秒的包装。所以你已经有了。 Date.getTime() 将以毫秒精度返回。

您为什么认为 Date 只有一秒的精度? Date.compareTo(Date anotherDate) 在毫秒级别进行比较。 因此,除非您在做一些奇怪的事情,否则您的 SortedMap 应该可以正常工作。

【讨论】:

  • 我认为它不能,因为我无法获得毫秒或设置它们。但你是对的。感谢那。错误来自这样一个事实,即我正在以它们进入的速度消耗消息。这意味着时间没有被正确使用。通过等待 350 毫秒然后从队列中消耗来修复它。
【解决方案2】:

我不确定你是否已经这样做了,但你可以创建自己的比较器并使用它。

附带说明一下,根据您的应用程序设置,您可能需要小心使用SimpleDateFormat,它存在一些问题。

【讨论】:

  • 您的链接已失效。 (这就是为什么仅链接的答案不好的原因。)您愿意详细说明“SimpleDateFormat 的问题”吗?
【解决方案3】:

java.time

我提供的是现代答案:使用现代 Java 日期和时间 API java.time 来处理您的日期和时间工作。首先是因为它比旧的日期和时间类(如 Date 和(哦,恐怖)SimpleDateFormat 设计不佳)要好得多。我们很幸运,它们早已过时。另一个优点是:您的日期时间字符串采用 ISO 8601 格式,java.time 类将这种格式解析为默认格式,即没有任何显式格式化程序。

    String stringFromCloud = "2014-06-14T08:55:56.789Z";
    Instant timestamp = Instant.parse(stringFromCloud);
    System.out.println("Parsed timestamp: " + timestamp);

输出:

解析的时间戳:2014-06-14T08:55:56.789Z

现在可以清楚地看到字符串已经以完整的毫秒精度解析(Instant 可以以纳秒精度解析,秒数最多为 9 位小数)。 Instant 对象可以作为 SortedMap 的键正常工作。

特殊情况:如果秒的分数为 0,则不打印。

    String stringFromCloud = "2014-06-14T08:56:59.000Z";

解析时间戳:2014-06-14T08:56:59Z

您需要相信,如果没有打印分数,那是因为它是 0。Instant 仍然可以很好地满足您的目的,在分数之前排序为 .001、.002 等。

你的解析出了什么问题?

首先,你遇到了一个比错过毫秒更糟糕的问题:你解析到了错误的时区。传入字符串中的尾随 Z 是 0 的 UTC 偏移量,需要这样解析。您的代码中发生的情况是 SimpleDateFormat 使用了您的 JVM 的时区设置而不是 UTC,从而导致长达 14 小时的错误。在大多数情况下,您的排序仍然是正确的。在您当地时区从夏令时 (DST) 转换前后,时间会不明确,因此解析可能不正确,从而导致错误的排序顺序。

正如 Mattias Isegran Bergander 在他的回答中所说,毫秒的解析应该可以在您的代码中使用。你不这么认为的原因可能是因为旧的Date 类的许多设计问题中的一个小问题:即使在内部它具有毫秒精度,它的toString 方法只打印秒,它忽略了毫秒。

链接

【讨论】:

    猜你喜欢
    • 2014-10-12
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 2016-03-26
    • 2021-06-30
    • 2018-12-22
    • 2012-04-08
    • 1970-01-01
    相关资源
    最近更新 更多