Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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

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 SimpleDate格式和解析,不会生成唯一值吗?_Java_Date_Serialization - Fatal编程技术网

Java SimpleDate格式和解析,不会生成唯一值吗?

Java SimpleDate格式和解析,不会生成唯一值吗?,java,date,serialization,Java,Date,Serialization,我想按如下顺序列出一个值得纪念的日期: SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); formater.setTimeZone(TimeZone.getTimeZone("UTC")); // Data is Date date = new Date(); // Serial String sdate = formater.format(date); // Deserial Date new

我想按如下顺序列出一个值得纪念的日期:

SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
formater.setTimeZone(TimeZone.getTimeZone("UTC"));

// Data is
Date date = new Date();

// Serial
String sdate = formater.format(date);

// Deserial
Date newDate = formater.parse(sdate);

// Check
assertEquals(newDate, date);

然而,结果newDate不等于原始日期?!有什么错误吗?

精度为yyyy-MM-dd HH:MM:ss的日期没有亚秒信息。你正在失去精确性

您可以通过检查时间戳来验证:

date.getTime() - newDate.getTime()
差异将告诉您在该过程中损失的毫秒数


当date.getTime是1000的倍数时,这可能会意外发生。

精度为yyyy-MM-dd HH:MM:ss的日期没有亚秒信息。你正在失去精确性

您可以通过检查时间戳来验证:

date.getTime() - newDate.getTime()
差异将告诉您在该过程中损失的毫秒数


当date.getTime是1000的倍数时,这可能会意外地起作用。

Ernest Kiwele给出的解释是正确的。这里有一个解决方案;怎么办呢

    Instant inst = Instant.now();

    // Serialize
    String sInst = inst.toString();

    // Deserialize
    Instant newInst = Instant.parse(sInst);

    // Check
    assertEquals(inst, newInst);
这个测试通过了。不需要显式格式化程序。Instant.toString生成ISO 8601格式2018-04-18T15:08:58.314727Z,其解析方法将相同格式解析回来

您可以对ZonedDateTime和java.time的其他日期时间类(现代java日期和时间API)执行相同的操作

不仅因为这个原因,我建议你跳过你在问题中使用的日期类。该类早已过时,而现代API通常更适合使用

如果您确实从旧式API中获取了一个无法更改的日期,并且需要在序列化和反序列化后返回一个日期,则序列化为即时仍然是一个方便的选项:

    Date date = new Date();

    // Serialize
    String sInst = date.toInstant().toString();

    // Deserialize
    Instant newInst = Instant.parse(sInst);
    Date newDate = Date.from(newInst);

    // Check
    assertEquals(date, newDate);
一个潜在的优势是您可以使用ISO 8601格式(国际标准)进行序列化,这可以确保许多不同编程语言的工具可以在需要时轻松地对字符串进行反序列化

链接 解释如何使用java.time。
欧内斯特·基威尔所作的解释是正确的。这里有一个解决方案;怎么办呢

    Instant inst = Instant.now();

    // Serialize
    String sInst = inst.toString();

    // Deserialize
    Instant newInst = Instant.parse(sInst);

    // Check
    assertEquals(inst, newInst);
这个测试通过了。不需要显式格式化程序。Instant.toString生成ISO 8601格式2018-04-18T15:08:58.314727Z,其解析方法将相同格式解析回来

您可以对ZonedDateTime和java.time的其他日期时间类(现代java日期和时间API)执行相同的操作

不仅因为这个原因,我建议你跳过你在问题中使用的日期类。该类早已过时,而现代API通常更适合使用

如果您确实从旧式API中获取了一个无法更改的日期,并且需要在序列化和反序列化后返回一个日期,则序列化为即时仍然是一个方便的选项:

    Date date = new Date();

    // Serialize
    String sInst = date.toInstant().toString();

    // Deserialize
    Instant newInst = Instant.parse(sInst);
    Date newDate = Date.from(newInst);

    // Check
    assertEquals(date, newDate);
一个潜在的优势是您可以使用ISO 8601格式(国际标准)进行序列化,这可以确保许多不同编程语言的工具可以在需要时轻松地对字符串进行反序列化

链接 解释如何使用java.time。
我目前无法检查,但我的直觉是:日期有毫秒,新日期没有!我建议您避免使用SimpleDataFormat类。它不仅和日期一起过时了很久,而且出了名的麻烦。今天我们的生活好多了。像Instant和ZonedDateTime这样的现代类也更适合序列化,因为它们可以在没有任何显式格式化程序的情况下解析回toString的结果。我目前无法检查,但我的直觉是:日期有毫秒,newDate没有!我建议您避免使用SimpleDataFormat类。它不仅和日期一起过时了很久,而且出了名的麻烦。今天我们的生活好多了。像Instant和ZonedDateTime这样的现代类也更适合序列化,因为它们可以在没有任何显式格式化程序的情况下解析回toString的结果。