.net 如何将具有长毫秒(纳秒)部分的字符串解析为DateTime?

e7arh2l6  于 2023-05-19  发布在  .NET
关注(0)|答案(3)|浏览(131)

我试图找出以下给定日期-时间文字的正确字符串格式:

18-JUN-13 12.17.36.000000000

使用MSDN,我设法合成了以下格式:
"d'-'MMM'-'y'T'h'.'m'.'s'.'fff"
但是当使用DateTime.ParseExact时,解析失败并返回FormatException:* 字符串未被识别为有效的DateTime*。
我的代码:

DateTime.ParseExact("18-JUN-13 12.17.36.000000000", "d'-'MMM'-'y'T'h'.'m'.'s'.'fff", null);
nfzehxib

nfzehxib1#

你可以用

dd-MMM-yy hh.mm.ss.fffffff

以 * 英语为基础的 * 文化,例如InvariantCulture。我现在在移动的上,所以我不能尝试它:(

  • AFAIK*,毫秒部分解析限制是7,这就是为什么你不能解析你的字符串 * 没有 * 操纵它。你可以像这样使用它;
var dt = DateTime.ParseExact("18-JUN-13 12.17.36.0000000",
                             "dd-MMM-yy HH.mm.ss.fffffff",
                             CultureInfo.InvariantCulture);

看起来这就是为什么我们将"fffffff"自定义格式作为毫秒的顶部字符。从docs;
虽然可以显示时间值的第二个分量的百万分之一,但该值 * 可能 * 没有意义。日期和时间值的精度取决于系统时钟的分辨率。在Windows NT 3.5(及更高版本)和Windows Vista操作系统上,时钟的分辨率约为10-15毫秒。
你问的;
你会怎么操作这根线呢

  • 好吧 *,一种方法是获取逗号的最后一个索引,然后将其子串到后面的8个索引,如;
string s = "18-JUN-13 12.17.36.000000000";
var dateString = s.Substring(0, s.LastIndexOf(".") + 8);
r3i60tvu

r3i60tvu2#

你不能直接解析(即ParseExact())小数点后超过7位的时间字符串 * 除非 *,正如juharr对DateTime format throws exception的评论所建议的那样,您将多余的数字解析为文字字符:

string before = "18-JUN-13 12.17.36.000000000";
string format = "d'-'MMM'-'y' 'h'.'m'.'s'.'fffffff'00'";
DateTime value = DateTime.ParseExact(before, format, null);
string after = value.ToString(format);

Console.WriteLine(before);// 18-JUN-13 12.17.36.000000000
Console.WriteLine(after); // 18-Jun-13 12.17.36.000000000

否则,您需要截断多余的数字,如Soner Gönül's answer
不幸的是,异常消息和文档都没有提到为什么fffffff/FFFFFFF是限制,因为原因很简单,但很容易被忽略。
0.0000001秒是:

  • 千万分之一秒,或者。。
  • 100纳秒或者。。
  • 一滴

滴答是DateTime可以表示的最小间隔。格式字符串,如ffffffff(八位有效数字)及以上不能有效,因为这将要求DateTime能够存储一个滴答的分数。虽然“String was not recognized as a valid DateTime”* 确实 * 描述了问题,但在这种情况下,不仅仅是输入不匹配指定的格式,而且输入也不能精确地用DateTime表示。

eufgjt7s

eufgjt7s3#

你有一堆单引号在那里,这是不正确的格式。试试这个

DateTime.ParseExact("18-JUN-13 12.17.36.000000000", "d-MMM-yTh.m.s.fff", null);

相关问题