【问题标题】:Best timestamp format for CSV/Excel?CSV/Excel 的最佳时间戳格式?
【发布时间】:2010-10-22 16:36:50
【问题描述】:

我正在编写一个 CSV 文件。我需要编写至少精确到秒的时间戳,最好精确到毫秒。 CSV 文件中时间戳的最佳格式是什么,以便 Excel 可以在最少的用户干预下准确、明确地解析它们?

【问题讨论】:

  • 您使用什么语言来创建输出?

标签: excel formatting csv timestamp


【解决方案1】:

我相信如果您使用 double 数据类型,在 Excel 中重新计算就可以正常工作。

【讨论】:

  • 我刚试过,效果很好。只需告诉 Excell 该特定列的格式是日期/时间。它不会从 CSV 中自动检测到这一点,因为它显然没有描述数据
【解决方案2】:

我猜ISO-format 是个好主意。 (Wikipedia article,还有时间信息)

【讨论】:

  • (否决;实际上,不,excel 无法识别该格式)
  • @Doug 我刚刚进行了测试以验证它:在 Office 2010 英文版中工作正常,尝试使用我的本地设置(瑞典语,恰好使用 ISO 日期格式和美国英语)。出于兴趣:它在哪个环境中失败了?我一点也不感到惊讶,它对某些人有效,对某些人失败:Excel 在我的经验中并不是一个真正的一致性奇迹......
  • 它绝对不适用于 OSX 的 office 2012。在我的测试中,excel 唯一能识别的“原生”格式是 MM/DD/YYYY HH:MM:SS;其他所有内容都被简单地视为文本。
  • 我在发现 Excel 无法识别 CSV 中的 ISO 格式日期后发现了这个问题。 IMO,这是 Excel 中的一个错误。
  • 这可能是,@Patrick。这在 2009 年有点难以测试;-)
【解决方案3】:

对于第二个精度,yyyy-MM-dd HH:mm:ss 应该可以解决问题。

我相信 Excel 在几分之一秒内不是很好(与 COM 对象 IIRC 交互时会丢失它们)。

【讨论】:

  • 是的——我同意你和 Fredrik 的看法。如果你能找到这些参考资料,我当然会很感激。谢谢!
  • 对于任何使用 Ruby 的 strftime 的人,等效的参数字符串是 "%Y-%m-%d %H:%M:%S"
  • @nickf - .CSV 只是一个文本文件。您可以将时区或您写入文件的任何其他内容显示为逗号分隔的纯文本;重要的是哪个应用程序将读取它,以及那个应用程序如何期待文本。 Here's documentation 来自国会图书馆的 CSV 标准。没有规定的方法来专门存储日期。还有RFC-4180CSV-1203 //creativyst.com/Doc/Articles/CSV/CSV01.htm)。
  • C#/IronPython File.GetLastWriteTimeUtc("your-path-here").ToString("yyyy-%m-%d %H:%MM:%ss")
  • 在带有 strftime() 的 python 中,格式也是 "%Y-%m-%d %H:%M:%S" - 与 Ruby 相同。
【解决方案4】:

之前使用“yyyy-MM-dd HH:mm:ss”的建议很好,但我相信 Excel 的时间分辨率比这要好得多。我发现this post 相当可信(跟随线程,你会看到很多算术和 Excel 实验),如果它是正确的,你会得到你的毫秒数。您可以在末尾添加小数位,即“yyyy-mm-dd hh:mm:ss.000”。

您应该知道,Excel 不一定会以您将看到所有精确度的方式来格式化数据(无需人工干预)。在我工作的计算机上,当我使用“yyyy-mm-dd hh:mm:ss.000”数据(手动使用记事本)设置 CSV 时,我在单元格中得到“mm:ss.0”和“m /d/yyyy  hh:mm:ss AM/PM”。

为了在没有人为干预的情况下在单元格中传达最大信息[1],您可能希望将时间戳分成日期部分和时间部分,时间部分只到秒。在我看来,Excel 希望在任何给定单元格中最多为您提供三个可见的“级别”(其中几分之一秒是他们自己的级别),而您需要七个:年、月、日、小时、分钟、秒,和几分之一秒。

或者,如果您不需要人类可读的时间戳,但希望它尽可能准确,您可能更愿意只存储一个大数字(在内部,Excel 只是使用天数,包括从“纪元”日期开始的小数天数)。


[1]即数字信息。如果您想查看尽可能多的信息但不关心用它进行计算,您可以编写一些 Excel 肯定会解析为字符串的格式,因此不用管它;例如“yyyymmdd.hhmmss.000”。

【讨论】:

    【解决方案5】:

    "yyyy-MM-dd hh:mm:ss.000" 格式不适用于所有语言环境。对于某些(至少是丹麦语)“yyyy-MM-dd hh:mm:ss,000”会更好。

    【讨论】:

    • 奇怪的是,当毫秒部分为 000 时,Excel 2010 不会检测日期。任何其他都可以。
    【解决方案6】:

    至于时区。我必须将 UTC 偏移量存储为距 UTC 的秒数,这样 Excel/OpenOffice 中的公式最终可以本地化日期时间。我发现这比存储任何前面有 0 的数字更容易。 -0900 在任何电子表格系统中都无法很好地解析,并且几乎不可能将其导入到培训人员去做。

    【讨论】:

      【解决方案7】:

      转到“控制面板”中的语言设置,然后转到“格式选项”,选择一个区域设置,然后查看 Windows 默认使用的所选区域设置的实际日期格式。是的,该时间戳格式是区域敏感的。 Excel 在解析 CSV 时使用这些格式。

      更进一步,如果语言环境使用 ASCII 以外的字符,您必须在相应的 pre-Unicode Windows“ANSI”代码页中发出 CSV,例如CP1251。 Excel 不接受 UTF-8。

      【讨论】:

        【解决方案8】:

        尝试 MM/dd/yyyy hh:mm:ss 格式。

        用于创建 XML 文件的 Java 代码。

        xmlResponse.append("mydate>").append(this.formatDate(resultSet.getTimestamp("date"), "MM/dd/yyyy hh:mm:ss a")).append("");

        public String formatDate(Date date, String format)
        {
            String dateString = "";
            if(null != date)
            {
                SimpleDateFormat dateFormat = new SimpleDateFormat(format);
                dateString = dateFormat.format(date);
            }
            return dateString;
        }
        

        【讨论】:

          【解决方案9】:

          "yyyy-mm-dd hh:mm:ss.000" 格式不适用于所有语言环境。为了 一些(至少是丹麦语)“yyyy-mm-dd hh:mm:ss,000”会更好。

          由 user662894 回复。

          我想补充一点:不要试图从 SQL Server 的 datetime2 数据类型中获取微秒:Excel 不能处理超过 3 个小数秒(即毫秒)。

          所以“yyyy-mm-dd hh:mm:ss.000000”不起作用,当 Excel 被输入这种字符串(来自 CSV 文件)时,它将执行 四舍五入而不是截断

          这可能没问题,除非微秒精度很重要,在这种情况下,最好不要触发自动数据类型识别,而是将字符串保留为字符串...

          【讨论】:

            【解决方案10】:

            所以,奇怪的是,excel 以不同的方式导入 csv 日期。 ,根据 csv 文件中使用的格式以不同的方式显示它们。不幸的是,ISO 8061 格式以字符串形式出现。这会阻止您自己重新格式化日期。

            所有确实以日期形式出现的...包含整个信息...但它们的格式不同...如果您不喜欢它,您可以为 excel 中的列选择一种新格式将工作。 (注意:你可以告诉它是作为一个有效的日期/时间进来的,因为它会右对齐......如果它作为一个字符串进来,它会左对齐)

            以下是我测试的格式:

            “yyyy-MM-dd”在excel中打开时显示为当然日期。 (也可以使用“MM/dd/yyyy”)

            “yyyy-MM-dd HH:mm:ss”默认显示格式为“MM/dd/yyyy HH:mm”(日期和时间不包括秒)

            “yyyy-MM-dd HH:mm:ss.fff”默认显示格式为“HH:mm:ss”(仅时间w/秒)

            【讨论】:

              【解决方案11】:

              给定一个包含日期时间列的 csv 文件,格式如下:yyyy-mm-dd hh:mm:ss

              Excel 以这种格式显示它:dd/mm/yyyy hh:mm

              例如2020-05-22 16:40:55 显示为 22/05/2020 16:40

              这显然是由 Windows 中选择的短日期和短时间格式决定的;例如,如果我将 Windows 中的短日期格式更改为 yyyy-mm-dd,Excel 会显示 2020-05-22 16:40。

              令人讨厌的是,我找不到任何方法让 Excel 自动显示秒数(我必须手动格式化 Excel 中的列)。但如果 csv 文件包含 hh:mm:ss 格式的时间列(例如 16:40:55),则 Excel 中会显示该时间列,包括秒数。

              【讨论】:

                【解决方案12】:

                我将时间戳写入 CSV 文件,格式为 yyyy-mm-dd hh:mm:ss。

                在 Excel 365 中,我创建了一个空白工作簿,转到“数据”选项卡并选择“来自文本/CSV。

                打开一个带有预览的对话框,奇怪的是,它只保留第一列时间戳,但显示它将转换第二列。

                您可以“加载”数据,也可以“转换数据”,这是我的选择。

                现在您在“Power Query 编辑器”中,您可以了解 Excel 如何将列引入。

                在我的例子中,我撤消了它所做的任何自动更改,并使用功能区上的一个小按钮告诉它两列都是数据类型“日期/时间”。

                按下关闭并加载会将其作为数据源导入 Excel,您可以对其进行排序等。

                【讨论】:

                  猜你喜欢
                  • 2015-01-24
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-05-11
                  • 1970-01-01
                  • 2017-05-21
                  相关资源
                  最近更新 更多