C#:获取服务器当前时间转指定本地时间,及中部时间转服务器时间求助
没问题,我来帮你一步步搞定这两个时区转换的问题!
首先咱们明确:美国中部时间(Central Time)对应的系统时区ID是 "Central Standard Time"(Windows系统),它包含夏令时自动切换的逻辑(UTC-6标准时间,UTC-5夏令时)。要实现你要的转换,步骤如下:
第一步:获取服务器的本地时区
在C#中直接用TimeZoneInfo.Local就能拿到服务器当前运行环境的时区信息。第二步:构造目标中部时间
你需要明确是当天的下午2点,所以先构造一个DateTime对象,再关联中部时区避免歧义。第三步:转换为服务器时区时间
用TimeZoneInfo.ConvertTime方法完成时区转换。
以下是完整代码示例:
// 获取服务器本地时区 TimeZoneInfo serverTimeZone = TimeZoneInfo.Local; // 加载美国中部时区 TimeZoneInfo centralTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); // 构造当天的中部时间下午2点 DateTime centralDateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 14, 0, 0); // 包装成带时区偏移的对象,避免日期时间歧义 DateTimeOffset centralTimeOffset = new DateTimeOffset(centralDateTime, centralTimeZone.GetUtcOffset(centralDateTime)); // 转换为服务器时区的时间 DateTimeOffset serverTime = TimeZoneInfo.ConvertTime(centralTimeOffset, serverTimeZone); // 输出结果 Console.WriteLine($"服务器时区: {serverTimeZone.DisplayName}"); Console.WriteLine($"中部时间下午2点对应的服务器时间: {serverTime:yyyy-MM-dd HH:mm:ss}");
像你举例的情况:如果服务器时区是EST(美国东部时间,时区ID "Eastern Standard Time"),转换后就是下午3点;如果是PST(太平洋时间,时区ID "Pacific Standard Time"),就是中午12点,完全符合你的预期。
这里推荐两种方式,其中用UTC时间转换的方式更可靠,能避免服务器时区变更或夏令时带来的问题:
方式1:从服务器本地时间转换
直接获取服务器的本地时间,再转换到目标时区:
// 获取服务器当前本地时间 DateTime serverLocalNow = DateTime.Now; // 目标时区(比如还是用中部时间举例) TimeZoneInfo targetTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); // 转换时间 DateTime targetLocalTime = TimeZoneInfo.ConvertTime(serverLocalNow, TimeZoneInfo.Local, targetTimeZone); Console.WriteLine($"服务器当前本地时间: {serverLocalNow:yyyy-MM-dd HH:mm:ss}"); Console.WriteLine($"转换为中部时间: {targetLocalTime:yyyy-MM-dd HH:mm:ss}");
方式2:从UTC时间转换(更推荐)
UTC是全球统一时间,不受时区和夏令时影响,先获取UTC时间再转换到目标时区:
// 获取当前UTC时间 DateTime utcNow = DateTime.UtcNow; // 目标时区 TimeZoneInfo targetTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); // 从UTC转换到目标时区 DateTime targetLocalTimeFromUtc = TimeZoneInfo.ConvertTimeFromUtc(utcNow, targetTimeZone); Console.WriteLine($"当前UTC时间: {utcNow:yyyy-MM-dd HH:mm:ss}"); Console.WriteLine($"转换为中部时间: {targetLocalTimeFromUtc:yyyy-MM-dd HH:mm:ss}");
额外注意
如果你的服务器是Linux/macOS环境,系统用的是IANA时区ID(比如中部时间对应 "America/Chicago"),在.NET Core/.NET 5+中 TimeZoneInfo.FindSystemTimeZoneById 也支持这些ID;如果需要兼容Windows和Linux,可以安装 TimeZoneConverter NuGet包,用 TZConvert.GetTimeZoneInfo() 来统一处理时区ID。
内容的提问来源于stack exchange,提问作者user3038537

