TimeZoneInfo.ConvertTimeFromUtc 未将旧日期转换为当时的夏令时
TimeZoneInfo.ConvertTimeFromUtc is not converting old dates to then daylight saving time
我正在使用 TimeZoneInfo.ConvertTimeFromUtc 方法将日期时间转换为目标日期时间。目前它在悉尼的 UTC+10。如果我 运行 代码完美地将时间转换为 UTC+10。但是在没有夏令时的一月份是 UTC+11。如果我输入一个 Jan 日期 运行 代码。它仍然将其转换为 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 / 东澳大利亚夏令时间/东澳大利亚标准时间"
EST2="23-05-2019 23:15:23/False/False/E.澳大利亚夏令时/E.澳大利亚标准时间"
在这两种情况下,它都会增加 10 小时,但在 1 月份应该会增加 11 小时。
我是否遗漏了代码中的任何内容。
.Net 似乎不认为 AEST 是使用夏令时的时区。如果我 运行 下面的代码,输出表明 CEST 是夏令时但 AEST 不是:
string timezone1 = "E. Australia Standard Time";
string timezone2 = "Central European Standard Time";
TimeZoneInfo info1 = TimeZoneInfo.FindSystemTimeZoneById(timezone1);
TimeZoneInfo info2 = TimeZoneInfo.FindSystemTimeZoneById(timezone2);
DateTime date = Convert.ToDateTime("2019-05-23 13:15:23.6090752");
DateTime datetime1 = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById(timezone1));
DateTime datetime2 = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById(timezone2));
var isDaylight1 = info1.IsDaylightSavingTime(datetime1);
var isDaylight2 = info2.IsDaylightSavingTime(datetime2);
Console.WriteLine(isDaylight1);
Console.WriteLine(isDaylight2);
根据www.timeanddate.com,夏令时在这个地区是可选的:
Some places observe daylight saving time/summer time during the summer, and therefore use AEDT (Australian Eastern Daylight Time) in the summer.
您使用了错误的时区。 "E. Australia Standard Time"
对应布里斯班时间,该时区不遵守夏令时,因此您的冬季和夏季时间返回时具有相同的 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 / AUS Eastern Daylight Time / AUS Eastern Standard Time"
EST2 = "23/05/2019 23:15:23 / True / False / AUS Eastern Daylight Time / AUS Eastern Standard Time"
我认为这正是您所期待的。
顺便说一下,DateTime.IsDaylightSavingTime() 使用您当地 时区来确定时间是否在夏令时。在这里看可能会产生误导。
我正在使用 TimeZoneInfo.ConvertTimeFromUtc 方法将日期时间转换为目标日期时间。目前它在悉尼的 UTC+10。如果我 运行 代码完美地将时间转换为 UTC+10。但是在没有夏令时的一月份是 UTC+11。如果我输入一个 Jan 日期 运行 代码。它仍然将其转换为 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 / 东澳大利亚夏令时间/东澳大利亚标准时间"
EST2="23-05-2019 23:15:23/False/False/E.澳大利亚夏令时/E.澳大利亚标准时间"
在这两种情况下,它都会增加 10 小时,但在 1 月份应该会增加 11 小时。
我是否遗漏了代码中的任何内容。
.Net 似乎不认为 AEST 是使用夏令时的时区。如果我 运行 下面的代码,输出表明 CEST 是夏令时但 AEST 不是:
string timezone1 = "E. Australia Standard Time";
string timezone2 = "Central European Standard Time";
TimeZoneInfo info1 = TimeZoneInfo.FindSystemTimeZoneById(timezone1);
TimeZoneInfo info2 = TimeZoneInfo.FindSystemTimeZoneById(timezone2);
DateTime date = Convert.ToDateTime("2019-05-23 13:15:23.6090752");
DateTime datetime1 = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById(timezone1));
DateTime datetime2 = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById(timezone2));
var isDaylight1 = info1.IsDaylightSavingTime(datetime1);
var isDaylight2 = info2.IsDaylightSavingTime(datetime2);
Console.WriteLine(isDaylight1);
Console.WriteLine(isDaylight2);
根据www.timeanddate.com,夏令时在这个地区是可选的:
Some places observe daylight saving time/summer time during the summer, and therefore use AEDT (Australian Eastern Daylight Time) in the summer.
您使用了错误的时区。 "E. Australia Standard Time"
对应布里斯班时间,该时区不遵守夏令时,因此您的冬季和夏季时间返回时具有相同的 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 / AUS Eastern Daylight Time / AUS Eastern Standard Time"
EST2 = "23/05/2019 23:15:23 / True / False / AUS Eastern Daylight Time / AUS Eastern Standard Time"
我认为这正是您所期待的。
顺便说一下,DateTime.IsDaylightSavingTime() 使用您当地 时区来确定时间是否在夏令时。在这里看可能会产生误导。