如何在C#中实现与JavaScript一致的ISO日期解析转换效果?
核心原因
两端输出的时间字符串时区标记不一致:
- JS端moment输出的是德国本地时区时间+对应时区偏移
+02:00,前端渲染时直接按带偏移的时间处理,显示为11:31 - 之前的C#代码输出的是UTC时区时间+
Z标记,前端会自动把UTC时间转换为用户本地时区时间,UTC 11:31对应+2时区就是13:31,因此显示异常
C# 实现代码
场景1:C#服务端与JS客户端时区一致
直接将UTC时间转换为服务端本地时区后格式化即可,和moment逻辑完全对齐:
// 正确解析带Z标记的UTC时间 var utcTime = DateTimeOffset.Parse("2021-07-22T11:31:43Z"); // 转换为运行环境本地时区 var localTime = utcTime.ToLocalTime(); // 格式化输出为不带毫秒、带时区偏移的ISO 8601格式,和moment.format()结果完全一致 var result = localTime.ToString("yyyy-MM-ddTHH:mm:sszzz");
输出结果为:2021-07-22T11:31:43+02:00
场景2:C#服务端与JS客户端时区不一致
如果C#服务端不在德国时区,建议明确指定目标时区(德国时区)转换,避免时区差异:
var utcTime = DateTimeOffset.Parse("2021-07-22T11:31:43Z"); // Windows系统德国时区ID为 "W. Europe Standard Time",Linux/macOS为 "Europe/Berlin" var germanTimeZone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"); var germanTime = TimeZoneInfo.ConvertTime(utcTime, germanTimeZone); var result = germanTime.ToString("yyyy-MM-ddTHH:mm:sszzz");
补充说明
你之前的moment用法确实不规范,传入的解析格式和输入时间格式不匹配,moment是fallback到原生Date解析才成功的,生产环境建议明确匹配输入格式,避免解析异常。
内容的提问来源于stack exchange,提问作者jebbie
相关产品推荐
相关产品推荐

