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

问题描述 投票:0回答:3

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

18-JUN-13 12.17.36.000000000

使用MSDN,我设法编写了以下格式:

"d'-'MMM'-'y'T'h'.'m'.'s'.'fff"

但是当使用

DateTime.ParseExact
时,解析失败并显示
FormatException
String was not recognized as a valid DateTime.

我的代码:

DateTime.ParseExact("18-JUN-13 12.17.36.000000000", "d'-'MMM'-'y'T'h'.'m'.'s'.'fff", null);
c# .net string datetime datetime-parsing
3个回答
4
投票

你可以使用

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

英语为基础的文化,例如

InvariantCulture
。我现在在手机上,所以我不能尝试:(

AFAIK,毫秒部分解析限制是

7
,这就是为什么你不能解析你的字符串without操纵它。你可以像这样使用它;

var dt = DateTime.ParseExact("18-JUN-13 12.17.36.0000000",
                             "dd-MMM-yy HH.mm.ss.fffffff",
                             CultureInfo.InvariantCulture);

看起来这就是为什么我们可能有

"fffffff"
自定义格式作为毫秒的顶级字符。来自文档;

虽然可以显示百万分之一秒 时间值的组成部分,该值可能没有意义。这 日期和时间值的精度取决于 系统时钟。在 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);

0
投票

您不能直接解析(即

ParseExact()
)小数点后超过七位的时间字符串除非,正如juharr对DateTime格式的评论所建议的那样抛出异常,您将多余的数字解析为文字字符

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 的回答

不幸的是,异常消息和文档都没有指出为什么

fffffff
/
FFFFFFF
是极限,因为原因很简单但容易被忽视。

0.0000001
秒是:

  • 百万分之一秒,或者...
  • 100 纳秒,或者...
  • 一个tick

刻度是

DateTime
可以表示的最小间隔。
ffffffff
(八位有效数字)及以后的格式字符串无效,因为这需要
DateTime
才能存储小数点。虽然“String was not recognized as a valid DateTime”does描述了问题,在这种情况下,不仅仅是输入不匹配指定的格式,而且输入不能用
DateTime精确表示
,无论如何。


-1
投票

你有一堆格式不正确的单引号。试试这个

DateTime.ParseExact("18-JUN-13 12.17.36.000000000", "d-MMM-yTh.m.s.fff", null);
© www.soinside.com 2019 - 2024. All rights reserved.