我正在写一个 CSV 文件。我需要编写至少精确到秒的时间戳,最好精确到毫秒。CSV 文件中时间戳的最佳格式是什么,以便 Excel 可以在最少的用户干预下准确、明确地解析它们?
12 回答
对于第二个精度, yyyy-MM-dd HH:mm:ss 应该可以解决问题。
我相信 Excel 在几分之一秒内不是很好(与 COM 对象 IIRC 交互时会丢失它们)。
早期使用“yyyy-MM-dd HH:mm:ss”的建议很好,尽管我相信 Excel 的时间分辨率比这要好得多。我觉得这篇文章相当可信(按照这个帖子,你会看到很多算术和 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”。
“yyyy-MM-dd hh:mm:ss.000”格式不适用于所有语言环境。对于某些(至少是丹麦语)“yyyy-MM-dd hh:mm:ss,000”会更好。
我相信如果你使用double
数据类型,在 Excel 中重新计算就可以了。
转到控制面板中的语言设置,然后转到格式选项,选择一个区域设置,然后查看 Windows 默认使用的所选区域设置的实际日期格式。是的,该时间戳格式是区域敏感的。Excel 在解析 CSV 时使用这些格式。
更进一步,如果语言环境使用 ASCII 以外的字符,您必须在相应的 pre-Unicode Windows“ANSI”代码页中发出 CSV,例如 CP1251。Excel 不接受 UTF-8。
“yyyy-mm-dd hh:mm:ss.000”格式不适用于所有语言环境。对于某些(至少是丹麦语)“yyyy-mm-dd hh:mm:ss,000”会更好。
正如用户662894所回答的那样。
我想补充一点:不要试图从 SQL Server 的 datetime2 数据类型中获取微秒数:Excel 不能处理超过 3 个小数秒(即毫秒)。
所以 "yyyy-mm-dd hh:mm:ss.000000" 不起作用,当 Excel 输入这种字符串(来自 CSV 文件)时,它将执行舍入而不是截断。
这可能没问题,除非微秒精度很重要,在这种情况下,最好不要触发自动数据类型识别,而是将字符串保留为字符串......
至于时区。我必须将 UTC 偏移量存储为距 UTC 的秒数,这样 Excel/OpenOffice 中的公式最终可以本地化日期时间。我发现这比存储任何前面有 0 的数字更容易。-0900 在任何电子表格系统中都不能很好地解析,并且导入它几乎不可能训练人们去做。
因此,奇怪的是,excel 以不同的方式导入 csv 日期。并且,根据 csv 文件中使用的格式以不同方式显示它们。不幸的是,ISO 8061 格式以字符串形式出现。这会阻止您自己重新格式化日期。
所有这些确实以日期形式出现...包含全部信息...但它们的格式不同...如果您不喜欢它,您可以为 excel 中的列选择一种新格式,它会起作用。(注意:你可以告诉它是作为一个有效的日期/时间进来的,因为它会右对齐......如果它作为一个字符串进来,它会左对齐)
以下是我测试的格式:
在 Excel 中打开时,“yyyy-MM-dd”当然会显示为日期。(也可以使用“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/秒)
尝试 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;
}
我将时间戳写入 CSV 文件,格式为 yyyy-mm-dd hh:mm:ss。
在 Excel 365 中,我创建了一个空白工作簿,转到“数据”选项卡并选择“来自文本/CSV。
打开一个带有预览的对话框,奇怪的是,它只保留了第一列时间戳,但显示它将转换第二列。
您可以“加载”数据,也可以“转换数据”,这是我的选择。
现在您在“Power Query 编辑器”中,您可以了解 Excel 如何将列引入。
就我而言,我撤消了它所做的任何自动更改,并使用功能区上的一个小按钮告诉它两列都是数据类型“日期/时间”。
按 Close & Load 将其作为数据源导入 Excel,您可以对其进行排序等。
给定一个包含以下格式的日期时间列的 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 中就会显示,包括秒数。