时区,夏令时

打印所有时区

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}");

 

posted @   yanghui01  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示