C#中如何使用DateTime.Today将日期转换为带Z后缀的UTC标准格式
首先需要明确:DateTime.Today 仅用于获取当前系统本地时区的当日0点时间,无法直接解析你传入的固定日期字符串。你给出的输入输出样例日期值不匹配,以下实现以输出符合yyyy-MM-ddTHH:mm:ssZ(UTC标准ISO8601格式)的要求为准。
实现思路
- 第一步:按照输入字符串的
月/日/年 12小时制带AM/PM格式规则,将字符串解析为DateTime类型对象,解析时指定固定区域规则,避免不同服务器的文化配置导致解析失败 - 第二步:将解析得到的时间转换为UTC时间——输出格式末尾的
Z是UTC零时区的标识,不能直接在本地时间后拼接Z后缀,否则会出现时间值错误 - 第三步:按照目标格式将UTC时间格式化输出。如果需要用到
DateTime.Today的「取日期当日0点」能力,可以调用解析后DateTime对象的.Date属性,效果和DateTime.Today一致,只是作用于你传入的目标日期而非系统当前日期。
可直接运行的实现代码
using System; using System.Globalization; public class DateConvertDemo { public static void Main() { string input = "8/24/2012 4:09:17 AM"; // 匹配输入的日期格式,使用InvariantCulture适配美式日期格式规则 string parsePattern = "M/d/yyyy h:mm:ss tt"; if (DateTime.TryParseExact( input, parsePattern, CultureInfo.InvariantCulture, // 如果输入时间本身就是UTC时间,替换下面参数为 DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal DateTimeStyles.None, out DateTime parsedTime)) { // 如果需要取该日期的0点值(等价于该日期对应的Today值),使用 parsedTime.Date // DateTime dateOnly = parsedTime.Date; // 本地时间转UTC,如果输入本身是UTC时间,删除这行直接用parsedTime DateTime utcTime = parsedTime.ToUniversalTime(); // 格式化为目标格式 string result = utcTime.ToString("yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture); Console.WriteLine(result); } } }
注意事项
- 如果你的输入时间本身就是UTC时间,不需要调用
ToUniversalTime()做转换,解析时直接指定DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal参数即可,避免时区偏移导致时间错误 - 格式化输出时必须指定
CultureInfo.InvariantCulture,否则部分区域配置下会出现非预期的字符 - 不要直接对非UTC时间拼接
Z后缀,否则生成的时间字符串不符合ISO8601标准,会被其他系统解析为错误的时间值
内容的提问来源于stack exchange,提问作者Doina Verejan
相关产品推荐
相关产品推荐

