将LDAP中的WhenChanged属性(Generalized-Time)转换为C#中的DateTime

我最近从使用S.DS命名空间(使用ADSI)切换到S.SD.Protocol命名空间。 唯一的问题是ADSI为我处理了Generalized-Time到DateTime的转换。 现在我为WhenChanged属性取回了值“20070828085401.0Z”。 DateTime.Parse()不会转换它,所以有另一种方式吗?

您获得的格式接近往返日期时间模式(“o”)和通用可排序往返日期时间模式(“u”)标准日期时间格式字符串,如此处所述。

一个kludgy解决方案是按下您适合模式的字符串,然后使用带有ParseExact的“o”或“u”标准格式字符串。

更好的方法是构造一个与您已经获得的数据匹配的自定义格式字符串 。 在标准日期时间格式字符串页面的“标准格式字符串工作方式”部分中,您将看到相当于“o”和“u”的完整自定义格式字符串。 这应该会给你一个良好的开端。


编辑 :添加代码

string format = "yyyyMMddHHmmss.f'Z'"; string target = "20070828085401.0Z"; DateTime d = DateTime.ParseExact(target, format, CultureInfo.InvariantCulture); 

在注释中, lixonn观察到,使用上面的格式字符串, ParseExact将无法成功解析像199412160532-0500这样的时间字符串。

它也不会解析许多其他有效字符串,例如没有尾随’祖鲁’指标的时间( 20070828085401.0 ); 没有小数部分的时间( 20070828085401Z )和以小时为单位表示分和秒的时间( 2007082808.90028Z )。

通过用K自定义说明符替换硬编码的'Z'可以使格式字符串更加宽容,该自定义说明符将接受’Z’,像-0500这样的偏移,什么也没有。 是否额外的灵活性是一件好事取决于您的应用程序。

请注意,即使使用K specifier Lixonn的字符串也不会被成功解析,因为它缺少一个小数部分来匹配格式字符串的.f组件。

您必须使用DateTime.ParseExact()指定确切的格式。 您可能需要稍微使用格式,但它会是这样的。

 DateTime result; CultureInfo provider = CultureInfo.InvariantCulture; string format="yyyyMMddhhmmss.0Z"; result = DateTime.ParseExact(dateString, format, provider); 

您可以使用datetime的.strptime()

  import datetime # Since 0Z denotes UTC, you can get rid of it and apply the timezone # later if you would like time_string = "20070828085401.0Z".split('.')[0] time_object = datetime.datetime.strptime(time_string, "%Y%m%d%H%M%S") 

time_object应输出为datetime.datetime(2007, 8, 28, 8, 54, 1) time_object datetime.datetime(2007, 8, 28, 8, 54, 1) 。 我相信这将是时区天真,相当于UTC时间。