Java日期到毫秒
我正在存储来自amazon云的消息,并在一个已排序的地图中按时间戳对它们进行排序 我正在用以下代码解析来自云的时间戳:Java日期到毫秒,java,date,time,amazon-web-services,Java,Date,Time,Amazon Web Services,我正在存储来自amazon云的消息,并在一个已排序的地图中按时间戳对它们进行排序 我正在用以下代码解析来自云的时间戳: Date timestamp = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS'Z'", Locale.ENGLISH).parse(time); 然后我将它们存储在一个排序的地图中,键是日期。 问题是,日期的精度只有秒。 我可以在1秒内发送多条消息,因此我需要以毫秒精度对它们进行排序。是否有数据结构允许这样做?只要源的分辨率
Date timestamp = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS'Z'", Locale.ENGLISH).parse(time);
然后我将它们存储在一个排序的地图中,键是日期。
问题是,日期的精度只有秒。
我可以在1秒内发送多条消息,因此我需要以毫秒精度对它们进行排序。是否有数据结构允许这样做?只要源的分辨率高于1秒。从模式上看是这样的,但您没有向我们展示任何输入示例
Date
只是自1970-01-01以来long
毫秒的包装。你已经有了Date.getTime()
将以毫秒精度返回该值
为什么你认为那个日期只有一秒的精度<代码>日期。比较到(另一个日期)以毫秒级进行比较。
因此,除非您正在做一些奇怪的事情,否则您的SortedMap应该可以正常工作。我不确定您是否已经这样做了,但您可以创建自己的比较器并使用它 另外,根据您的应用程序设置,您可能需要注意如何使用,但它存在一些问题。java.time 我提供了一个现代的答案:在日期和时间工作中使用java.time,这是一个现代的java日期和时间API。首先,因为它比旧的日期和时间类(如
date
和(哦,恐怖)SimpleDateFormat
)好得多,它们设计得很差。我们很幸运,它们早已过时。另一个优点是:日期时间字符串采用ISO8601格式,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
的键
角盒:如果秒数i为0,则不打印
String stringFromCloud = "2014-06-14T08:56:59.000Z";
解析时间戳:2014-06-14T08:56:59Z
您需要相信,当没有打印分数时,这是因为分数为0。瞬间
仍然可以很好地满足您的需要,在瞬间之前用分数.001、.002等进行排序
你的语法分析出了什么问题?
首先,您遇到了一个比丢失毫秒更糟糕的问题:您正在解析到错误的时区。传入字符串中的尾随Z
是UTC偏移量0,需要进行解析。代码中发生的情况是,SimpleDataFormat
使用JVM的时区设置而不是UTC,从而导致长达14小时的错误。在大多数情况下,您的排序仍然是正确的。在本地时区的夏季时间(DST)转换前后,时间将不明确,因此解析可能不正确,导致错误的排序顺序
正如Mattias Isegran Bergander在他的回答中所说,毫秒的解析应该在代码中起作用。您之所以不这么认为,可能是因为旧的Date
类的许多设计问题中有一个很小的问题:尽管它在内部具有毫秒精度,但它的toString
方法只打印秒,而不打印毫秒
链接
- 解释如何使用java.time
SSS
所以毫秒必须在那里如果时间包含UTC时区(Z
),请使用yyyy-MM-dd'T'hh:MM:ss.SSSZ
而不是yyyy-MM-dd'T'hh:MM:ss.SSS'Z'
Z
将抓取Z
以及例如,+0100
请打印出时间戳。getTime()您能给出一个您将使用的时间time
值的示例吗?谢谢。我想它不能,因为我无法获取毫秒或设置毫秒。但你是对的。谢谢你。这个错误是因为我正在以消息传入的速率消费消息。这意味着时间没有得到适当利用。通过等待350毫秒然后从队列中消耗来修复此问题。您的链接已断开。(这就是为什么只有链接的答案是不好的。)您愿意详细说明“SimpleDataFormat的问题”吗?