【问题标题】:Unable to Parse DateTime in asp.net from excel file of the format - 25-OCT-13 01.08.24.732000000 PM无法从格式为 25-OCT-13 01.08.24.732000000 PM 的 excel 文件解析 asp.net 中的 DateTime
【发布时间】:2013-11-12 01:32:40
【问题描述】:

我正在阅读的 excel 文件的日期时间列值为"25-OCT-13 01.08.24.732000000 PM",并尝试将其读入 .Net 的 DateTime 格式

DateTime.TryParseExact(certDate, "dd-MMM-yy hh.mm.ss.fffffffff tt", CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out certifiedDateTime) 

但它总是错误的。我错过了什么。

我在 Visual Studio 2013、.Net 4.5 中使用 C#

【问题讨论】:

    标签: c# asp.net .net excel datetime-conversion


    【解决方案1】:

    看来您最多只能有 7 个 f 元素。

    这行得通:

    string certDate = "25-Oct-13 01.08.24.7320000 PM";
    DateTime certifiedDateTime;
    DateTime.TryParseExact(certDate, "dd-MMM-yy hh.mm.ss.fffffff tt", 
       CultureInfo.InvariantCulture, 
       System.Globalization.DateTimeStyles.None, 
       out certifiedDateTime);
    certifiedDateTime.Dump();
    

    这似乎是因为 DateTime 被存储为一个代表刻度的 64 位数字。 Eric Lippert 有一篇很好的相关文章,名为 Precision and accuracy of DateTime

    要获得额外的精度,您可能需要查看不同的库。也许 Jon Skeet 的 Noda Time,虽然这也可能没有帮助。

    但是,我猜您实际上并不希望亚秒级精度到小数点后 9 位(特别是因为除非尾随零是一个很大的巧合,否则原始数据中不太可能有这种精度)。

    因此,如果您愿意牺牲这种多余的精度,您可以使用 Regex 或类似的方法来解析毫秒并将它们减少到 7 位数。

    因此,如果您愿意牺牲多余的精度,MarcinJuraszek's 评论以使用包含0 的格式听起来是最好的方法:

    DateTime.TryParseExact(certDate, "dd-MMM-yy hh.mm.ss.fffffff00 tt", 
       CultureInfo.InvariantCulture, 
       System.Globalization.DateTimeStyles.None, 
       out certifiedDateTime);
    

    【讨论】:

    • 您还可以在fffffff 之后添加额外的“00”,但这需要您输入的所有日期都以零结尾:"dd-MMM-yy hh.mm.ss.fffffff00 tt"
    • 很好的建议 - 更新的答案包括在内。如果您想要投票,请随时将其添加为答案。
    • 我已经开始写自己的答案,但后来你的答案出现了,我决定发表评论。很高兴你喜欢我的想法!
    • 太棒了!你们俩都是救生员。我知道只有 7f,但我不知道用什么替换下一个 2f。现在我做了0。是的,我不认为我们正在以这种精度工作!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多