CSV / Excel的最佳时间戳格式?

时间:2009-04-29 20:27:36

标签: excel formatting csv timestamp

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

12 个答案:

答案 0 :(得分:83)

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

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

答案 1 :(得分:16)

早先使用“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”。

答案 2 :(得分:13)

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

答案 3 :(得分:4)

我相信如果您使用double数据类型,Excel中的重新计算就可以了。

答案 4 :(得分:3)

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

更进一步,如果语言环境使用的是ASCII以外的字符,则必须在相应的Unicode前版本的Windows" ANSI"代码页,例如CP1251。 Excel不接受UTF-8。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

  

" 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文件)时,它将执行舍入而不是截断

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

答案 7 :(得分:0)

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

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

  
    

xmlResponse.append("&数值指明MyDate GT;&#34)附加(this.formatDate(了ResultSet.getTimestamp("日期&#34),     " MM / dd / yyyy hh:mm:ss a"))。追加("");

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

答案 8 :(得分:0)

因此,奇怪的是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”(仅带秒数的时间)

答案 9 :(得分:0)

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

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

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

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

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

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

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

答案 10 :(得分:-1)

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

答案 11 :(得分:-1)

给出一个带有datetime列的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中显示的内容,包括秒。