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