我正在使用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 / E. Australia Summer Time / E. Australia Standard Time”
EST2 =“ 23-05-2019 23:15:23 /错误/错误/ E.澳大利亚夏令时间/ E.澳大利亚标准时间”
在两种情况下,它都会增加10个小时,但在一月份它应该增加11个小时。
我在代码中缺少任何内容吗?
答案 0 :(得分:4)
您使用的时区错误。 "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 /对/错/ AUS东部夏令时间/ AUS东部标准时间”
我想这就是您的期望。
顺便说一句,DateTime.IsDaylightSavingTime()使用您的本地时区来确定时间是否在DST内。在这里查看它可能会产生误导。
答案 1 :(得分:2)
.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,夏令时在该区域是可选的:
某些地方在夏季遵守夏令时/夏令时,因此在夏季使用AEDT(澳大利亚东部夏令时)。