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


110

我正在写一个CSV文件。我需要写的时间戳至少精确到秒,最好精确到毫秒。CSV文件中时间戳的最佳格式是什么,以便Excel能够以最少的用户干预对其进行准确而明确的解析?


您使用什么语言创建输出?
PeterPerháč09年

Answers:


103

为了达到第二个精度,yyyy-MM-dd HH:mm:ss应该可以解决问题。

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


是的-我同意您和Fredrik的意见。如果您能找到这些参考文献,我将不胜感激。谢谢!

18
对于使用Ruby的用户strftime,等效的参数字符串为"%Y-%m-%d %H:%M:%S"
Greg Matthew Crossley,2016年

2
@nickf- .CSV只是一个文本文件。您可以将时区或您写入文件的其他任何内容显示为以逗号分隔的纯文本;重要的是哪个应用程序将读取它,以及应用程序如何期待文本。 这是来自国会图书馆的CSV标准文档。没有规定的方式来专门存储日期。也是RFC-4180CSV-1203 //creativyst.com/Doc/Articles/CSV/CSV01.htm)。
ashleedawg

C#/ IronPython File.GetLastWriteTimeUtc(“此处为您的路径”​​).ToString(“ yyyy-%m-%d%H:%MM:%ss”)
Konrads,

在带strftime()的python中,格式也将"%Y-%m-%d %H:%M:%S"与Ruby相同。
rcronk

18

早先的建议使用“ 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”,在“ / d / yyyy hh:mm:ss AM / PM”。

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

或者,如果您不需要时间戳可读性,但希望它尽可能准确,则您可能希望仅存储大量数字(内部,Excel仅使用天数,包括小数天) ,自“时代”日期开始)。


[1]即数字信息。如果您希望看到尽可能多的信息,但又不关心使用它来进行计算,则可以组成某种格式,Excel肯定会将其解析为一个字符串,因此不用理会;例如“ yyyymmdd.hhmmss.000”。


14

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


2
奇怪的是,当毫秒部分为000时,Excel 2010无法检测日期。其他任何方法都可以。
Dio F

4

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


我只是尝试了,并且效果很好。只需告诉Excell该特定列的格式为日期/时间即可。它不会自动从CSV中检测到此数据,因为它显然没有描述数据
PeterPerháč09年

3

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

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


1

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


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

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


0

我猜想ISO格式是个好主意。(维基百科文章,还有时间信息)


1
(downvote;实际上,不,excel无法识别该格式)
Doug

1
@Doug我只是运行了一个测试来验证这一点:在Office 2010英文版中运行正常,并尝试使用我的本地设置(瑞典语,恰好使用ISO格式作为日期,以及美国英语)。出于兴趣:它在哪种环境下对您不利?我毫不奇怪,它对某些人有用,而对某些人却失败:Excel并不是我所经历的始终如一的奇迹……
FredrikMörk2013年

1
对于Office 2012 for OSX,它绝对不起作用。excel在我的测试中似乎可以识别的唯一“本机”格式是MM / DD / YYYY HH:MM:SS;其他所有内容都被简单地视为文本。
Doug

1
在发现Excel无法识别CSV中的ISO格式日期后,我发现了这个问题。IMO,那是Excel中的错误。
billpg 2014年

2
可能就是@Patrick。那在2009年很难测试;-)
FredrikMörk16年

0

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

Java代码创建XML文件。

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;
}

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”(仅带秒数的时间)


-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中显示的内容,包括秒。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.