【发布时间】:2010-10-22 16:36:50
【问题描述】:
我正在编写一个 CSV 文件。我需要编写至少精确到秒的时间戳,最好精确到毫秒。 CSV 文件中时间戳的最佳格式是什么,以便 Excel 可以在最少的用户干预下准确、明确地解析它们?
【问题讨论】:
-
您使用什么语言来创建输出?
标签: excel formatting csv timestamp
我正在编写一个 CSV 文件。我需要编写至少精确到秒的时间戳,最好精确到毫秒。 CSV 文件中时间戳的最佳格式是什么,以便 Excel 可以在最少的用户干预下准确、明确地解析它们?
【问题讨论】:
标签: excel formatting csv timestamp
我相信如果您使用 double 数据类型,在 Excel 中重新计算就可以正常工作。
【讨论】:
我猜ISO-format 是个好主意。 (Wikipedia article,还有时间信息)
【讨论】:
对于第二个精度,yyyy-MM-dd HH:mm:ss 应该可以解决问题。
我相信 Excel 在几分之一秒内不是很好(与 COM 对象 IIRC 交互时会丢失它们)。
【讨论】:
strftime 的人,等效的参数字符串是 "%Y-%m-%d %H:%M:%S"
.CSV 只是一个文本文件。您可以将时区或您写入文件的任何其他内容显示为逗号分隔的纯文本;重要的是哪个应用程序将读取它,以及那个应用程序如何期待文本。 Here's documentation 来自国会图书馆的 CSV 标准。没有规定的方法来专门存储日期。还有RFC-4180 和CSV-1203 //creativyst.com/Doc/Articles/CSV/CSV01.htm)。
"%Y-%m-%d %H:%M:%S" - 与 Ruby 相同。
之前使用“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”。
【讨论】:
"yyyy-MM-dd hh:mm:ss.000" 格式不适用于所有语言环境。对于某些(至少是丹麦语)“yyyy-MM-dd hh:mm:ss,000”会更好。
【讨论】:
至于时区。我必须将 UTC 偏移量存储为距 UTC 的秒数,这样 Excel/OpenOffice 中的公式最终可以本地化日期时间。我发现这比存储任何前面有 0 的数字更容易。 -0900 在任何电子表格系统中都无法很好地解析,并且几乎不可能将其导入到培训人员去做。
【讨论】:
转到“控制面板”中的语言设置,然后转到“格式选项”,选择一个区域设置,然后查看 Windows 默认使用的所选区域设置的实际日期格式。是的,该时间戳格式是区域敏感的。 Excel 在解析 CSV 时使用这些格式。
更进一步,如果语言环境使用 ASCII 以外的字符,您必须在相应的 pre-Unicode Windows“ANSI”代码页中发出 CSV,例如CP1251。 Excel 不接受 UTF-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;
}
【讨论】:
"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 文件)时,它将执行 四舍五入而不是截断。
这可能没问题,除非微秒精度很重要,在这种情况下,最好不要触发自动数据类型识别,而是将字符串保留为字符串...
【讨论】:
所以,奇怪的是,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/秒)
【讨论】:
给定一个包含日期时间列的 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 中会显示该时间列,包括秒数。
【讨论】:
我将时间戳写入 CSV 文件,格式为 yyyy-mm-dd hh:mm:ss。
在 Excel 365 中,我创建了一个空白工作簿,转到“数据”选项卡并选择“来自文本/CSV。
打开一个带有预览的对话框,奇怪的是,它只保留第一列时间戳,但显示它将转换第二列。
您可以“加载”数据,也可以“转换数据”,这是我的选择。
现在您在“Power Query 编辑器”中,您可以了解 Excel 如何将列引入。
在我的例子中,我撤消了它所做的任何自动更改,并使用功能区上的一个小按钮告诉它两列都是数据类型“日期/时间”。
按下关闭并加载会将其作为数据源导入 Excel,您可以对其进行排序等。
【讨论】: