You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:40:45