【问题标题】:Parsing Oracle Date to C# datetime将 Oracle 日期解析为 C# 日期时间
【发布时间】:2022-02-01 18:22:14
【问题描述】:

我需要在c#中将Parse以下字符串作为DateTime

"22-FEB-21 09.52.41.256898000 AM"

我尝试了以下方法,但它抛出异常

DateTime.ParseExact(
  "22-FEB-21 09.52.41.256898000 AM",
  "DD-MON-YY HH.mm.ss.ff AM", 
   CultureInfo.InvariantCulture);

抛出的异常

字符串未被识别为有效的日期时间。

【问题讨论】:

  • 为什么毫秒只有两个ff?
  • "字符串未被识别为有效的日期时间。"
  • 不是 MMM 而不是 MON
  • d-MMM-yy h.m.s.ffffff'000' tt
  • 您是如何从 Oracle 中获取日期的?因为 ADO.Net 首先应该返回一个 DateTime 对象,这意味着您可能有代码(可能在库中)做额外的工作来将其转换为字符串,您现在必须将其转换 back 到 DateTime... 由于本地化问题,这是数据层中一些最昂贵的代码,您现在运行的次数比您需要的多 两倍

标签: c# datetime type-conversion


【解决方案1】:

试试

d-MMM-yy h.m.s.ffffff'000' tt

格式字符串。即

var result = DateTime.ParseExact(
  "22-FEB-21 09.52.41.256898000 AM", 
  "d-MMM-yy h.m.s.ffffff'000' tt", 
   CultureInfo.InvariantCulture);

格式说明:

 d      - day in one ore two digit format
 MMM    - month (abbreviation)
 yy     - year (two digits)
 h      - hour 1..12 or 01..12
 m      - minutes 00..59 or 0..59
 s      - seconds 00..59 or 0..59
 ffffff - fraction of seconds
'000'   - 000
 tt     - AM or PM 

【讨论】:

    【解决方案2】:

    您的日期字符串存在一些问题。 首先,你确定你得到了 9 个小数位吗?由于 Oracle 只支持 6 位小数的精度,也许您可​​以在查询端做一些事情来删除这些?

    你的格式字符串也有问题。

    1. 这个月应该是 MMM 而不是 MON
    2. 应该是 hh,因为您使用的是 12 小时制标准 (AM/PM) 而不是 24 小时制。

    然后您需要修复小数秒,并使用字符串匹配最后两个零。 您的格式字符串最终为:

    "d-MMM-yy hh.mm.ss.fffffff'00' tt"
    

    所以要测试它,你可以运行这个:

    var date = DateTime.ParseExact(
       "22-FEB-21 09.52.41.258998000 AM",
       "d-MMM-yy hh.mm.ss.fffffff'00' tt", CultureInfo.InvariantCulture);
    Console.WriteLine(date);
    

    这应该可以解决您的问题。

    【讨论】:

    • 小心dd:我们不能确定2 月2 日 是否会带有前导零:02-FEB-21 09.52.41.258998000 AM 而不是2-FEB-21 09.52.41.258998000 AM。请输入d 而不是dd 以保证安全
    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多