【问题标题】:Incorrect date format when writing to CSV through Java通过 Java 写入 CSV 时的日期格式不正确
【发布时间】:2019-03-20 16:31:09
【问题描述】:

所以,我有一个方法可以将一些对象列表写入 CSV。

private void writeToCSV(List<Employee> empList) {
    try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream(System.getProperty("java.io.tmpdir")+"Test.csv"), "UTF-8"))) {
        empList.forEach(eachEmployee -> {
            StringBuilder builder = new StringBuilder();
            builder.append(eachEmployee.getName());
            builder.append(CSV_SEPARATOR);
            builder.append(eachEmployee.getID());
            builder.append(CSV_SEPARATOR);
            builder.append(eachEmployee.getJoiningDate());
            writer.write(builder.toString());
            writer.newLine();
        });
    }
}

这里,员工的入职日期为 2019/03/20 格式,即 yyyy/MM/dd 格式。而且我也应该以相同的格式将其写入 CSV。 但是当我检查 CSV 时,它是 2019 年 3 月 20 日,即 MM/dd/yyyy 格式。 知道我哪里出错了吗?

编辑:加入日期是一种字符串

【问题讨论】:

  • 什么是加入日期?字符串还是日期对象?
  • 更新了问题。它是一种字符串
  • 您需要将字符串解析为日期对象,然后再次解析为字符串。
  • 您是如何检查 CSV 的?碰巧,您在 Excel 中打开了它?在这种情况下,Excel 可能已对其进行了转换。尝试使用简单的文本编辑器打开文件。
  • @RobertKock 是的,我确实在 Excel 中打开了它。我能做些什么来对抗 Excel 的这种行为吗?

标签: java csv bufferedwriter


【解决方案1】:

Locale

您的 JVM 当前默认 Locale 可能会在生成表示日期值的文本时被隐式应用。我只能猜测,因为您忽略了解释被调用方法的作用以及它的返回值的数据类型是什么。

java.time

您的代码也很可能使用了具有可悲缺陷的日期时间类,该类在几年前被采用 JSR 310 的 java.time 类所取代。

最终的解决方案是在您的代码中采用 java.time 类。

ISO 8601

在将日期时间值序列化为文本时,学习使用标准 ISO 8601 格式。对于 YYYY-MM-DD 格式的日期。 java.time 类在生成/解析字符串时默认使用 ISO 8601 格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 2021-09-30
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多