时区,夏令时
打印所有时区
var zones = TimeZoneInfo.GetSystemTimeZones(); foreach (var z in zones) { Console.WriteLine($"{z.Id} - {z.DisplayName}, {z.StandardName}, {z.DaylightName}"); }
DateTime默认为Unspecified
var dt1 = new DateTime(1970, 1, 1, 10, 0, 0); Console.WriteLine($"{dt1.ToLocalTime()}, {dt1.ToUniversalTime()}"); //1970/1/1 18:00:00, 1970/1/1 2:00:00 dt1 = new DateTime(1970, 1, 1, 10, 0, 0, DateTimeKind.Unspecified); Console.WriteLine($"{dt1.ToLocalTime()}, {dt1.ToUniversalTime()}"); //1970/1/1 18:00:00, 1970/1/1 2:00:00 dt1 = new DateTime(1970, 1, 1, 10, 0, 0, DateTimeKind.Local); Console.WriteLine($"{dt1.ToLocalTime()}, {dt1.ToUniversalTime()}"); //1970/1/1 10:00:00, 1970/1/1 2:00:00 dt1 = new DateTime(1970, 1, 1, 10, 0, 0, DateTimeKind.Utc); Console.WriteLine($"{dt1.ToLocalTime()}, {dt1.ToUniversalTime()}"); //1970/1/1 18:00:00, 1970/1/1 10:00:00
不同时区时间,转到标准时区
TimeZoneInfo usaTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); //美国东部时区(UTC-5), 比北京时间晚13个小时 DateTime usaDate = new DateTime(2024, 3, 10, 1, 59, 0); DateTime utcDate = TimeZoneInfo.ConvertTimeToUtc(usaDate, usaTimeZone); long timeMillis1 = utcDate.Ticks / 10000; DateTime cnDate = new DateTime(2024, 3, 10, 14, 59, 0, DateTimeKind.Local); long timeMillis2 = cnDate.ToUniversalTime().Ticks / 10000; if (timeMillis1 != timeMillis2) Console.WriteLine($"timeMillis: {timeMillis1}, {timeMillis2}");
c#中的夏令时判断
TimeZoneInfo cnTimeZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time"); TimeZoneInfo usaTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); //美国东部时区(UTC-5), 比北京时间晚13个小时 Console.WriteLine($"{usaTimeZone.Id} - {usaTimeZone.DisplayName}, {usaTimeZone.StandardName}, {usaTimeZone.DaylightName}"); Console.WriteLine($"---------- 夏令时开始判断"); //2024年美国夏令时从3/10 2:00开始, 到11/3 2:00结束 DateTime usaDate = new DateTime(2024, 3, 10, 1, 59, 0); var result1 = usaTimeZone.IsDaylightSavingTime(usaDate); //false Console.WriteLine($"usaDate:{usaDate}, isdst:{result1}"); DateTime utcDate = TimeZoneInfo.ConvertTimeToUtc(usaDate, usaTimeZone); //不在夏令时区间时, 比北京时间慢5个小时, 2024/3/10 6:59:00 DateTime cnDate = TimeZoneInfo.ConvertTimeFromUtc(utcDate, cnTimeZone); //不在夏令时区间时, 比北京时间慢13个小时, 所以: 2024/3/10 14:59:00 Console.WriteLine($"cnDate: {cnDate}"); usaDate = new DateTime(2024, 3, 10, 2, 0, 0); result1 = usaTimeZone.IsDaylightSavingTime(usaDate); //false: 因为1:59:59下一秒就直接拨快1小时变为3:00:00 (2:00:00~2:59:59不存在) Console.WriteLine($"usaDate:{usaDate}, isdst:{result1}"); usaDate = new DateTime(2024, 3, 10, 2, 50, 0); result1 = usaTimeZone.IsDaylightSavingTime(usaDate); //false //DateTime dateUtc = TimeZoneInfo.ConvertTimeToUtc(date1, usaTimeZone); //抛异常 2:00:00~2:59:59不存在 Console.WriteLine($"usaDate:{usaDate}, isdst:{result1}"); usaDate = new DateTime(2024, 3, 10, 3, 0, 0); result1 = usaTimeZone.IsDaylightSavingTime(usaDate); //true Console.WriteLine($"usaDate:{usaDate}, isdst:{result1}"); utcDate = TimeZoneInfo.ConvertTimeToUtc(usaDate, usaTimeZone); // cnDate = TimeZoneInfo.ConvertTimeFromUtc(utcDate, cnTimeZone); //在夏令时区间时, 比北京时间慢12个小时, 所以: 2024/3/10 15:00:00 Console.WriteLine($"utcDate:{utcDate}, cnDate:{cnDate}"); Console.WriteLine($"---------- 夏令时结束判断"); //虽然夏令时结束时间是11/3 2:00结束, 但因为1:00~1:59是重叠时间, 所以这部分时间直接算作非夏令时了 //1:00~1:59会走两遍, 第1遍是夏令时还没结束的00:59:59 -> 1:00:00; 第2遍是夏令时结束时, 拨慢1小时后, 1:59:59 -> 1:00:00 usaDate = new DateTime(2024, 11, 3, 2, 0, 0); result1 = usaTimeZone.IsDaylightSavingTime(usaDate); //false Console.WriteLine($"usaDate:{usaDate}, isdst:{result1}"); usaDate = new DateTime(2024, 11, 3, 1, 0, 0); result1 = usaTimeZone.IsDaylightSavingTime(usaDate); //false Console.WriteLine($"usaDate:{usaDate}, isdst:{result1}"); utcDate = TimeZoneInfo.ConvertTimeToUtc(usaDate, usaTimeZone); cnDate = TimeZoneInfo.ConvertTimeFromUtc(utcDate, cnTimeZone); //2024/11/3 14:00:00, 相差13小时 Console.WriteLine($"cnDate:{cnDate}"); usaDate = new DateTime(2024, 11, 3, 0, 59, 0); result1 = usaTimeZone.IsDaylightSavingTime(usaDate); //true Console.WriteLine($"usaDate:{usaDate}, isdst:{result1}"); utcDate = TimeZoneInfo.ConvertTimeToUtc(usaDate, usaTimeZone); cnDate = TimeZoneInfo.ConvertTimeFromUtc(utcDate, cnTimeZone); //2024/11/3 12:59:00, 相差12小时 Console.WriteLine($"cnDate:{cnDate}");
美国东部时区(UTC-5)的时间:2024/11/03 01:59,显示成中国东8区时间是多少呢?
var dt = DateTime.Parse("2024/11/03 01:59:00"); result1 = usaTimeZone.IsDaylightSavingTime(dt); //false Console.WriteLine($"{dt}, isdst:{result1}"); //2024/11/3 1:59:00, isdst:false utcDate = TimeZoneInfo.ConvertTimeToUtc(dt, usaTimeZone); cnDate = TimeZoneInfo.ConvertTimeFromUtc(utcDate, cnTimeZone); //2024/11/3 14:59:00, 与东8相差13小时 Console.WriteLine($"utcDate:{utcDate}, cnDate:{cnDate}");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义