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

将Discord Bot从TypeScript转C#后,三月时间转换出现1小时偏差

问题分析

你的问题出在两个核心点:

  1. 硬编码时区偏移,忽略夏令时变化:基辅时区(乌克兰时区)的偏移量并非固定+3,2022年3月27日之前执行东欧标准时间(GMT+2),之后切换为东欧夏令时间(GMT+3)。你硬编码的+3偏移在夏令时生效前的日期会导致计算偏差。
  2. 时间转换逻辑颠倒:你将输入的本地时间直接标记为UTC时间,再通过减去偏移量调整,这和正确的时区转换逻辑完全相反——正确流程应该是将指定时区的本地时间转换为UTC时间,而非反过来。
解决方案

使用C#内置的TimeZoneInfo类处理时区转换,它会自动适配夏令时的偏移规则,同时修正转换逻辑:

修改后的代码

// 1. 创建输入的本地时间(标记为Unspecified,明确这是对应时区的本地时间)
var localDateTime = new DateTime(year, month, day, hour, minute, second, DateTimeKind.Unspecified);

// 2. 获取对应时区的TimeZoneInfo实例
var targetTimeZone = zone switch
{
    "UTC" => TimeZoneInfo.Utc,
    "KIEV" => TimeZoneInfo.FindSystemTimeZoneById("Eastern European Standard Time"), // 基辅对应的系统时区ID
    "MOSCOW" => TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time"),
    _ => TimeZoneInfo.Utc
};

// 3. 将本地时间转换为UTC时间
var utcDateTime = TimeZoneInfo.ConvertTimeToUtc(localDateTime, targetTimeZone);

// 4. 转换为UNIX时间戳
var unixTimestamp = ((DateTimeOffset)utcDateTime).ToUnixTimeSeconds();

代码说明

  • TimeZoneInfo.FindSystemTimeZoneById会根据系统时区ID加载完整的时区规则,自动处理夏令时的偏移切换,无需手动维护偏移数值。
  • TimeZoneInfo.ConvertTimeToUtc负责将指定时区的本地时间精准转换为UTC时间,彻底避免手动计算偏移的误差。
  • 修正了原代码中“将本地时间误标记为UTC时间”的逻辑错误。
验证示例

以你提到的20.03.2022 20:12:00 GMT+03:00(实际当时基辅为GMT+2)为例:
本地时间2022-03-20 20:12:00通过上述代码转换为UTC时间是2022-03-20 18:12:00,对应的UNIX时间戳为1647790320,转换回基辅本地时间即为预期的20:12:00。

内容的提问来源于stack exchange,提问作者Bohdan Petrenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:03:11