c# - TimeZoneInfo.ConvertTimeFromUtc 没有将旧日期转换为夏令时
问题描述
我正在使用 TimeZoneInfo.ConvertTimeFromUtc 方法将日期时间转换为目标日期时间。当前在悉尼的 UTC+10。如果我运行代码,它将完美地将时间转换为 UTC+10。但是在没有夏令时的一月是UTC + 11。如果我输入一月日期运行代码。它仍然将其转换为 UTC+10 而不是 UTC+11。
下面是示例代码。
TimeZoneInfo ESTZone = TimeZoneInfo.FindSystemTimeZoneById("E. Australia Standard Time");
DateTime date = Convert.ToDateTime("2019-01-23 13:15:23.6090752");
DateTime SydneyDateTime = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById(Timezone));
string EST = SydneyDateTime.ToString() + " / " + SydneyDateTime.IsDaylightSavingTime().ToString() + " / " + ESTZone.IsDaylightSavingTime(SydneyDateTime)+" / " + ESTZone.DaylightName + " / " + ESTZone.StandardName;
DateTime IndiaDateTime = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"));
DateTime date2 = Convert.ToDateTime("2019-05-23 13:15:23.6090752");
DateTime SydneyDateTime2 = TimeZoneInfo.ConvertTimeFromUtc(date2, TimeZoneInfo.FindSystemTimeZoneById(Timezone));
string EST2 = SydneyDateTime2.ToString() + " / " + SydneyDateTime2.IsDaylightSavingTime().ToString() + " / " + ESTZone.IsDaylightSavingTime(SydneyDateTime2) + " / " + ESTZone.DaylightName + " / " + ESTZone.StandardName;
输出结果:
EST = "23-01-2019 23:15:23 / False / False / E. Australia Summer Time / E. Australia Standard Time"
EST2="23-05-2019 23:15:23 / False / False / E. Australia Summer Time / E. Australia Standard Time"
在这两种情况下,它都会增加 10 小时,但在一月份应该增加 11 小时。
我是否遗漏了代码中的任何内容。
解决方案
您使用了错误的时区。 "E. Australia Standard Time"
对应于布里斯班时间,并且该时区不遵守 DST,因此您的冬季和夏季时间以相同的 UTC 偏移量返回。
对于悉尼,您需要使用"AUS Eastern Standard Time"
. ConvertTimeFromUtc
将为该时区应用适当的 UTC 偏移量,并为您提供您期望的时间。
这是您的片段,包括使用适当的时区,以及围绕时区初始化进行的一些编辑,以便编译:
public void ConvertTimes()
{
string Timezone = "AUS Eastern Standard Time";
TimeZoneInfo ESTZone = TimeZoneInfo.FindSystemTimeZoneById(Timezone);
DateTime date = Convert.ToDateTime("2019-01-23 13:15:23.6090752");
DateTime SydneyDateTime = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById(Timezone));
string EST = SydneyDateTime.ToString() + " / " + SydneyDateTime.IsDaylightSavingTime().ToString() + " / " + ESTZone.IsDaylightSavingTime(SydneyDateTime) + " / " + ESTZone.DaylightName + " / " + ESTZone.StandardName;
DateTime IndiaDateTime = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"));
DateTime date2 = Convert.ToDateTime("2019-05-23 13:15:23.6090752");
DateTime SydneyDateTime2 = TimeZoneInfo.ConvertTimeFromUtc(date2, TimeZoneInfo.FindSystemTimeZoneById(Timezone));
string EST2 = SydneyDateTime2.ToString() + " / " + SydneyDateTime2.IsDaylightSavingTime().ToString() + " / " + ESTZone.IsDaylightSavingTime(SydneyDateTime2) + " / " + ESTZone.DaylightName + " / " + ESTZone.StandardName;
}
这给出了输出:
EST = "24/01/2019 00:15:23 / False / True / 澳大利亚东部夏令时间 / 澳大利亚东部标准时间"
EST2 = "23/05/2019 23:15:23 / True / False / AUS Eastern Daylight Time / AUS Eastern Standard Time"
我认为这是您所期望的。
顺便说一句, DateTime.IsDaylightSavingTime() 使用您当地的时区来确定时间是否在 DST 内。在这里看可能会产生误导。
推荐阅读
- php - 如何在while循环中仅显示一次值但显示html循环的长度
- python - 在python中将字符串添加到不带引号的字典
- unix - 使用unix中txt文件中存在的名称重命名目录中的多个文件
- java - Eclipse Jar 文件没有资源
- python - itertools 排列组合
- android - android:gradle 产品风味搞砸了 minSdkVersion
- java - 在java中从键盘获取多行然后单个字符
- c - 在低级 c 图形代码中管理 linux framebuffer(fb0) 权限
- python - 在每个火车时期后进行评估
- python - 从一个 python 脚本到另一个传递一个简单参数的简单调用