Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java日期到毫秒_Java_Date_Time_Amazon Web Services - Fatal编程技术网

Java日期到毫秒

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秒内发送多条消息,因此我需要以毫秒精度对它们进行排序。是否有数据结构允许这样做?只要源的分辨率

我正在存储来自amazon云的消息,并在一个已排序的地图中按时间戳对它们进行排序

我正在用以下代码解析来自云的时间戳:

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的问题”吗?