mscorlib.dll中的System.FormatException用于DateTime转换

问题描述:

我试图将Active Directory属性(whenCreated)转换为DateTime然后String,但我不断收到一个FormatException,有什么想法为什么?下面是代码:mscorlib.dll中的System.FormatException用于DateTime转换

string format = "YYYYMMDDHHMMSS.0Z"; 
DateTime dt = DateTime.ParseExact(sResult.Properties["whenCreated"][0].ToString(),format,CultureInfo.InvariantCulture); 
string whenCreated = dt.ToString(); 

此外,sResult.Properties["whenCreated"][0].ToString()是从Active Directory搜索(检索日期)的结果,并有串(通用时间)的语法。

+0

你调试的代码? sResult.Properties [“whenCreated”] [0]包含什么值? –

+1

字符串的实际值是多少? –

+0

该字符串是具有String(Generalized Time)语法的Active Directory属性,如MS所述https://msdn.microsoft.com/en-us/library/ms684436%28v=vs.85%29.aspx。我已经做了一个格式错误,我会在后期修复(但仍然不起作用)。 –

DateTime.ParseExact方法需要一个格式字符串,该格式字符串告诉它在输入字符串中哪个组件的有效日期。您的'd'格式不符合此标准。我不知道你的输入内容(如果你添加它会有帮助)。但让我们假设今天是“2017/31/05 10:27:45”。然后,您的格式字符串必须是: “YYYY/DD/MM HH:MM:SS”

DateTime dt = DateTime.ParseExact("2017/31/05 10:27:45","yyyy/dd/MM HH:mm:ss",CultureInfo.InvariantCulture); 
+0

是的,我刚刚看到了,并在我的帖子中修复。我现在放的格式是我从输入字符串中检索的格式。 –

+0

什么是您从Active Directory获得的示例值? –

+0

02/09/2008 11:26:38。对不起,真的很糟糕的问题这解决了我的问题,我习惯于具有特定格式的Active Directory属性accountExpires,并且认为AD中的所有日期都必须进行转换,但这符合我的需求。感谢帮助! –

据OP链接的documentation

广义时间格式语法是“YYYYMMDDHHMMSS.0Z”。一个可接受的值的一个例子是“20010928060000.0Z”

和:

如果在比GMT以外的时间带规定的时间,时区和GMT之间的差被附加到字符串替代“Z”形式为“YYYYMMDDHHMMSS.0 [+/-] HHMM”。可接受值的一个例子是“20010928060000.0 + 0200”

所以你需要为了解析字符串,像这两格式字符串:

string adDate = "20010928060000.0Z"; 
string adDate2 = "20010928060000.0+0200"; 

string format = "yyyyMMddhhmmss.0Z"; 
string format2 = "yyyyMMddhhmmss.0zzz"; 
DateTime dtdtdt = DateTime.ParseExact(adDate2, new string[] { format, format2 }, 
          CultureInfo.InvariantCulture,DateTimeStyles.None); 
+0

“Z”表示UTC偏移量(带有+/-符号),但仍可能产生“字符串未被识别为有效日期时间”。 –

+0

@TetsuyaYamamoto看到我更新的答案 – Pikoh