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

时间:2011-04-01 19:03:55

标签: c# datetime ldap

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

4 个答案:

答案 0 :(得分:6)

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

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

更好的方法是构建一个匹配您已经获得的数据的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之类的时间字符串。

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

通过将硬编码的'Z'替换为接受'Z'的偏移K custom specifier,像@0500这样的偏移量,可以使格式字符串更加宽容。 这种额外的灵活性是否有益取决于您的应用程序。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您可以使用日期时间.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)。我相信这将是时区的天真,相当于UTC时间。

答案 3 :(得分:0)

c_accumulate