C# Windows Form应用中UTC日期与毫秒时间戳互相转换实现方法
C# DateTimePicker UTC时间戳转换实现方案
前置配置
首先确保DateTime控件的格式符合你的要求,可在窗体初始化代码中添加以下配置:
dateTimePicker1.Format = DateTimePickerFormat.Custom; dateTimePicker1.CustomFormat = "MM/dd/yyyy hh:mm:ss tt"; // 可选:强制使用固定区域规则避免不同系统的格式差异 dateTimePicker1.FormatProvider = CultureInfo.InvariantCulture;
1. 控件选中时间转UTC毫秒时间戳
注意不要直接调用ToUniversalTime()方法,该方法会将控件默认的本地时间属性做时区偏移转换,不符合你全程基于UTC的要求。我们只需要显式指定控件返回时间的Kind为UTC,再计算Unix时间戳即可:
// 取控件选中时间,显式标记为UTC类型,不做时区偏移转换 DateTime selectedUtcTime = DateTime.SpecifyKind(dateTimePicker1.Value, DateTimeKind.Utc); // 计算和1970-01-01 00:00:00 UTC的时间差,取整毫秒数 long utcMilliTimestamp = (long)(selectedUtcTime - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
得到的utcMilliTimestamp可直接发送给服务端。
2. 服务端UTC毫秒时间戳转控件显示格式
全程基于UTC时区转换,不需要转本地时间:
// 示例:服务端返回的UTC毫秒时间戳 long serverUtcTimestamp = 1627463450000; // 转成UTC时间对象 DateTime utcTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(serverUtcTimestamp); // 赋值给DateTimePicker,标记为Unspecified避免控件自动做本地时区转换 dateTimePicker1.Value = DateTime.SpecifyKind(utcTime, DateTimeKind.Unspecified); // 若需要单独获取格式化后的字符串,可使用以下代码 string formattedUtcTime = utcTime.ToString("MM/dd/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture);
注意事项
- 代码需要引用
System.Globalization命名空间来使用CultureInfo - 所有格式化操作建议传入
CultureInfo.InvariantCulture,避免系统区域语言不同导致AM/PM、日期分隔符显示异常 - 全程不要调用
ToLocalTime()、ToUniversalTime()这类时区转换方法,仅通过DateTime.SpecifyKind修改时间类型标记即可满足需求
内容的提问来源于stack exchange,提问作者newcoder101
相关产品推荐
相关产品推荐

