C#中如何解析带时区的DateTime?UTC时间转指定时区问题
解决DateTime解析UTC时间与时区转换的问题
你的问题出在格式字符串和输入不匹配上——你用了"yyyyMMddHHmmssZhhmm",但这个格式要求输入字符串是UTC时间+时区偏移的组合,而你现在是把UTC时间和时区分开的两个值,直接这么拼肯定会报错。下面给你两种可行的实现方式:
方法一:先解析UTC时间,再转换到目标时区
这种方法逻辑更清晰,先把UTC时间字符串解析为UTC类型的DateTime,再转换到UTC+8时区:
// 1. 解析UTC时间,指定DateTimeKind.Utc确保类型正确 DateTime utcTime = DateTime.ParseExact("20180523160000", "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AssumeUniversal | System.Globalization.DateTimeStyles.AdjustToUniversal); // 2. 创建UTC+8的时区对象(也可以用对应的系统时区ID) TimeZoneInfo utcPlus8Zone = TimeZoneInfo.CreateCustomTimeZone("UTC+8", TimeSpan.FromHours(8), "UTC+8", "UTC+8"); // 3. 转换到目标时区 DateTime targetTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, utcPlus8Zone); // 输出结果:2018-05-24 00:00:00 Console.WriteLine(targetTime.ToString("yyyy-MM-dd HH:mm:ss"));
方法二:构造带偏移的完整时间字符串再解析
如果你想把UTC时间和时区偏移合并成一个字符串再解析,需要注意格式字符串的正确写法,以及偏移格式要匹配:
// 把UTC时间和偏移组合成"yyyyMMddHHmmss+HH:mm"格式的字符串 string timeWithOffset = "20180523160000+08:00"; // 使用正确的格式字符串解析:"yyyyMMddHHmmsszzz"(zzz代表带冒号的时区偏移) DateTime targetTime = DateTime.ParseExact(timeWithOffset, "yyyyMMddHHmmsszzz", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal); // 输出结果:2018-05-24 00:00:00 Console.WriteLine(targetTime.ToString("yyyy-MM-dd HH:mm:ss"));
关键注意点:
- 第一种方法更推荐,因为它明确区分了UTC时间解析和时区转换的步骤,逻辑更直观,也不容易因格式字符串写错出错。
- 第二种方法里,格式字符串的
zzz对应带冒号的偏移(比如+08:00),而Z是专门用来表示UTC(即偏移为+00:00)的,不能用来匹配其他偏移值,这也是你之前代码报错的核心原因。
内容的提问来源于stack exchange,提问作者hazimdikenli
相关产品推荐
相关产品推荐

