我最近从使用 S.DS 命名空间(使用 ADSI)切换到 S.SD.Protocol 命名空间。唯一的问题是 ADSI 为我处理了 Generalized-Time 到 DateTime 的转换。现在,我为 WhenChanged 属性取回值“20070828085401.0Z”。 DateTime.Parse() 不会转换它,还有其他方法吗?
最佳答案
您获得的格式接近往返日期时间模式(“o”)和通用可排序往返日期时间模式(“u”)标准日期时间格式字符串,如 here 所述.
一个笨拙的解决方案是修改你得到的字符串以适应模式,然后将“o”或“u”标准格式字符串与ParseExact一起使用。 .
更好的方法是构造一个 custom format string与您已经获得的数据相匹配。在标准日期时间格式字符串页面的“标准格式字符串如何工作”部分中,您将看到等同于“o”和“u”的完整自定义格式字符串。这应该会给您一个良好的开端。
编辑:添加代码
string format = "yyyyMMddHHmmss.f'Z'";
string target = "20070828085401.0Z";
DateTime d = DateTime.ParseExact(target, format, CultureInfo.InvariantCulture);
评论中lixonn观察到,使用上面的格式字符串,ParseExact
将无法成功解析像 199412160532-0500
这样的时间字符串。
它也不会解析许多其他有效字符串,例如没有尾随“Zulu”指示符的时间 (20070828085401.0
);不带小数部分的时间 (20070828085401Z
) 以及将分钟和秒表示为小数小时的时间 (2007082808.90028Z
)。
通过用 K custom specifier 替换硬编码的 'Z'
可以使格式字符串稍微更宽容一些。它将接受 'Z',一个像 -0500 这样的偏移量,什么都不接受。 这种额外的灵 active 是否是一件好事将取决于您的应用。
请注意,即使使用 K 说明符
,Lixonn 的字符串也不会被成功解析,因为它缺少匹配格式字符串的 .f
组件的小数部分。
关于c# - 将 LDAP 中的 WhenChanged 属性(通用时间)转换为 C# 中的 DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5517695/