将C#的日期时间对象转换为Excel日期格式

3
我需要将C# datetime对象转换为可怕的Excel日期格式:即自1900年1月1日以来的天数,表示为浮点数。有没有不用DIY代码的方法来实现它?我需要这个来创建符合Excel标准的CSV导出文件。在网上搜索时,除了一篇好的博客文章外,我没有找到任何有用的信息。博客文章链接:https://datapub.cdlib.org/2014/04/10/abandon-all-hope-ye-who-enter-dates-in-excel/

CSV不同于Excel。而且Excel日期是被很好定义的,只要你知道日期实际上是如何存储的,就不需要担心格式问题。这曾经是人见人知的常识。 - Panagiotis Kanavos
@PanagiotisKanavos 感谢您的快速回复。大多数用户将点击CSV文件并使用Excel打开该文件。因此,时间戳必须格式化为“OLE自动化数据”(也称为表示日期的Excel浮点数)。我完全理解CSV只是文本,没有“列类型”随列一起传递的情况。 - Gianluca Ghettini
CSV是文本文件。Excel文件是一个压缩的XML文件。当您单击csv时,Excel使用当前用户区域设置和默认值导入文本文件。您问的是如何在Excel中存储日期,而不是如何将CSV数据导入Excel。PS:链接的文章更多地涉及R与Excel的差异和误解。 - Panagiotis Kanavos
如果您想要一个明确的日期文本格式,请仅使用ISO8601格式,例如 2016-10-21T13:45。Excel会检测到这不是本地化的日期格式。任何其他格式实际上都是可能失败的本地化格式。 - Panagiotis Kanavos
另一个选项是使用生成实际 xlsx 文件而不是 CSV 的包或库,例如 EPPlus。创建工作表就像 sheet.LoadFromCollection(someList) 一样容易。 - Panagiotis Kanavos
显示剩余2条评论
2个回答

12

Excel日期使用OLE自动化日期格式。您可以使用DateTime.ToOADate 方法检索它。

OA日期是一个double类型的数字,其中整数部分是从1899年12月30日算起到具体日期的天数(早于这个日期的为负数),小数部分则是24小时制下当前时间与零时之间的小时数。

这种类型在COM/VB6时代经常被使用。现在仍然需要用到它来处理Excel和调用期望包含日期内容的COM API。


4
您可以使用以下方法将Excel日期转换回C# DateTime。
return DateTime.FromOADate(SerialDate);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接