当前位置: 首页 > 编程语言 > C#

时区之间的时间转换分享

时间:2023-04-10 19:19:47 C#

时区之间的时间转换我正在使用TimeZoneInfo.ConvertTime方法将时间从一个时间转换为另一个时间。将日期时间从1/6转换为珀斯时,将其从珀斯转换为SriJeyawardenepura将其转换为1/31/200511.30pm,同时将时间(1月31日晚上11.30)从SriJeyawardenepura转换回珀斯,它转换为1/1/2006凌晨3点。为什么时区转换会有小时差?哇,这是双重打击!我只是偶然发现了这篇文章,根本不会发布任何内容,因为它太旧了,而且OP没有显示任何代码。但后来好奇心战胜了我,所以我查了一下。仅使用.NETBCL:stringtzid1="W.AustraliaStandardTime";//珀斯TimeZoneInfotz1=TimeZoneInfo.FindSystemTimeZoneById(tzid1);stringtzid2="斯里兰卡标准时间";//SriJeyawardenepuraTimeZoneInfotz2=TimeZoneInfo.FindSystemTimeZoneBy(tzid2);DateTimedt1=newDateTime(2006,1,1,2,0,0);调试.WriteLine(dt1);//1/1/20062:00:00AMDateTimedt2=TimeZoneInfo.ConvertTime(dt1,tz1,tz2);调试.WriteLine(dt2);//12/31/200511:30:00PMDateTimedt3=TimeZoneInfo.ConvertTime(dt2,tz2,tz1);调试.WriteLine(dt3);//1/1/20063:00:00AM果然,OP描述的差异。起初我认为这一定是由于某种夏令时问题,所以我检查了斯里兰卡和珀斯。虽然两者都在2006年实现了转型,但直到今天都没有接近转型。但是,我认为我应该使用DateTimeOffset检查来避免任何歧义问题:stringtzid1="W.AustraliaStandardTime";//珀斯TimeZoneInfotz1=TimeZoneInfo.FindSystemTimeZoneById(tzid1);stringtzid2="斯里兰卡标准时间";//SriJeyawardenepuraTimeZoneInfotz2=TimeZoneInfo.FindSystemTimeZoneById(tzid2);DateTimedt=newDateTime(2006,1,1,2,0,0);DateTimeOffsetdto1=newDateTimeOffset(dt,tz1.GetUtcOffset(dt));调试。写行(dto1);//1/1/20062:00:00AM+08:00DateTimeOffsetdto2=TimeZoneInfo.ConvertTime(dto1,tz2);调试.WriteLine(dto2);//12/31/200511:30:00PM+05:30DateTimeOffsetdto3=TimeZoneInfo.ConvertTime(dto2,tz1);调试.WriteLine(dto3);//1/1/20063:00:00AM+09:00它仍然关闭。你可以看到它认为目标时间应该是+09:00,但是珀斯直到2006年12月3日才切换到它。一月份显然还是+08:00。好吧,我想……野田是时候来救援了!首先,让我们使用相同的Windows.NETBCL时区进行检查。stringtzid1="W.澳大利亚标准时间";//珀斯DateTimeZonetz1=DateTimeZoneProviders.Bcl[tzid1];stringtzid2="斯里兰卡标准时间";//SriJeyawardenepuraDateTimeZonetz2=DateTimeZoneProviders.Bcl[tzid2];LocalDateTimeldt1=newLocalDateTime(2006,1,1,2,0,0);ZonedDateTimezdt1=ldt1.InZoneStrictly(tz1);Debug.WriteLine(zdt1.ToDateTimeOffset());//1/1/20062:00:00AM+08:00ZonedDateTimezdt2=zdt1.WithZone(tz2);Debug.WriteLine(zdt2.ToDateTimeOffset());//12/31/200511:30:00PM+05:30ZonedDateTimezdt3=zdt1.WithZone(tz1);Debug.WriteLine(zdt3.ToDateTimeOffset());//1/1/20062:00:00AM+08:00嘿,这似乎是固定的,对吧?如果是这样,则意味着问题不在于Windows时区数据,因为NodaTime的BCL提供程序使用完全相同的数据。所以TimeZoneInfo.ConvertTime中肯定存在一些实际错误。有傻瓜#1。因此,要检查是否一切正常,让我们尝试使用IANATZDB数据。众所周知,它更准确:stringtzid1="Australia/Perth";DateTimeZonetz1=DateTimeZoneProviders.Tzdb[tzid1];stringtzid2="亚洲/科伦坡";//SriJeyawardenepuraDateTimeZonetz2=DateTimeZoneProviders.Tzdb[tzid2];LocalDateTimeldt1=newLocalDateTime(2006,1,1,2,0,0);ZonedDateTimezdt1=ldt1.InZoneStrictly(tz1);Debug.WriteLine(zdt1.ToDateTimeOffset());//1/1/20062:00:00AM+08:00ZonedDateTimezdt2=zdt1.WithZone(tz2);Debug.WriteLine(zdt2.ToDateTimeOffset());//1/1/200612:00:00AM+06:00ZonedDateTimezdt3=zdt1.WithZone(tz1);Debug.WriteLine(zdt3.ToDateTimeOffset());//1/1/20062:00:00AM+08:00我的朋友们,这是Whammy#2。请注意,中间时间使用+06:00偏移量?原以为不对,到这里再次查看时,发现TZDB数据是正确的。斯里兰卡当地时间是+06:00。直到4月才变为+05:30。所以回顾一下Whammys:最好只使用NodaTime和TZDB!更新感谢JonSkeet帮助确定第一个问题是TimeZoneInfo类正在解释“W.AustraliaStandardTime”时区。我深入研究了.NETFrameworkReference源代码,我相信它在私有静态方法TimeZoneInfo.GetIsDaylightSavingsFromUtc中。我认为他们没有考虑到DST并不总是在同一日历年开始和停止。在这种情况下,他们将2006年调整规则应用于2005年,并在1/2/2005开始于12/4/2005之前获得1/2/2005时间。他们确实试图调和这应该是2006年(错误地添加了一年),但他们认为数据没有颠倒。这个问题可能出现在夏令时在冬季开始的任何时区(例如澳大利亚),并且它会在转换规则发生变化时以某种形式出现——就像2006年那样。我在这里有一个关于MicrosoftConnect的问题。我提到的“第二次命中”只是因为Windows时区注册表项中不存在斯里兰卡的历史数据。为了向Matt的回答添加更多信息,B??CL似乎对其自己的珀斯数据非常困惑。似乎认为在2005年底有两次转换-一次在世界标准时间下午4点,一次在八小时后。演示:使用系统;classTest{staticvoidMain(){varid="W.澳大利亚标准时间";//珀斯varzone=TimeZoneInfo.FindSystemTimeZoneById(id);varutc1=newDateTime(2005,12,31,15,59,0,DateTimeKind.Utc);varutc2=newDateTime(2005,12,31,16,00,0,DateTimeKind.Utc);varutc3=newDateTime(2005,12,31,23,59,0,DateTimeKind.Utc);varutc4=newDateTime(2006,1,1,0,0,0,DateTimeKind.Utc);Console.WriteLine(zone.GetUtcOffset(utc1));Console.WriteLine(zone.GetUtcOffset(utc2));Console.WriteLine(zone.GetUtcOffset(utc3));Console.WriteLine(zone.GetUtcOffset(utc4));}}结果:08:00:00//下午3:59UTC09:00:00//下午4:00UTC09:00:00//下午11:59UTC08:00:00//下一个UTC上午12:00day这非常离奇,可能与利比亚时区断裂有关——虽然没有两次转换,只有一次错位。您必须发布特定代码才能确定。可能存在一个问题,例如,一个转换应用了夏令时,而另一个转换没有应用。时区管理可能很微妙。我建议您查看这个JonSkeet博客以获得很好的概述。事实上,获得正确的.NET时间类非常棘手,以至于Jon采用了Joda-Time到.NET的端口,称为NodaTime。任何支持多个时区的项目都值得认真考虑。您在转换时间时是否考虑过Daysavings?请参考下面的链接,您会得到答案。显示的时间绝对正确http://www.timeanddate.com/worldclock/timezone.html?n=196&syear=2000以上是C#学习教程:跨时区分时的全部内容,如果有用各位和需要了解更多C#学习教程的,希望大家多多关注~本文采集自网络,不代表立场,如有侵权,请点击右边联系管理员删除。如需转载请注明出处: