C#:如何获取并保留24小时制的UTC DateTime?
解决UTC时间解析后保留时区标识的问题
问题根源
你的代码里DateTime.Parse(s)默认会把解析出的DateTime对象的Kind属性设为Unspecified,而非Utc。这就导致后续使用这个对象时,系统无法识别它代表UTC时间,可能会自动转换为本地时区时间,不符合你的需求。
解决方案
方法1:解析时指定UTC样式
用DateTime.Parse的重载方法,传入DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal参数,明确告诉解析器将字符串视为UTC时间,并保留UTC的时区标识:
var curr = DateTime.UtcNow; string s = curr.ToString("yyyy-MM-dd HH:mm:ss"); DateTime foo = DateTime.Parse(s, null, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); Console.WriteLine(foo); // 此时foo.Kind为Utc,输出UTC时间 Console.ReadLine();
方法2:用ParseExact精确解析
如果要严格匹配时间格式、避免解析歧义,推荐使用DateTime.ParseExact:
var curr = DateTime.UtcNow; string s = curr.ToString("yyyy-MM-dd HH:mm:ss"); DateTime foo = DateTime.ParseExact(s, "yyyy-MM-dd HH:mm:ss", null, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); Console.WriteLine(foo); Console.ReadLine();
方法3:手动设置Kind(不推荐)
如果已经得到了Kind为Unspecified的DateTime,可以通过DateTime.SpecifyKind手动修改其Kind为Utc——注意前提是这个时间确实是UTC时间:
var curr = DateTime.UtcNow; string s = curr.ToString("yyyy-MM-dd HH:mm:ss"); DateTime foo = DateTime.Parse(s); foo = DateTime.SpecifyKind(foo, DateTimeKind.Utc); // 手动标记为UTC时间 Console.WriteLine(foo); Console.ReadLine();
补充说明
HH格式符本身就是24小时制,所以你转换字符串时已经是24小时制表现,问题的核心是保留UTC的时区标识(由DateTime.Kind属性控制),而非24小时制格式。- 当
DateTime的Kind为Utc时,后续的转换、输出操作都会基于UTC处理,不会自动转成本地时区时间。
内容的提问来源于stack exchange,提问作者Amanda_Panda
相关产品推荐
相关产品推荐

