我正在使用timezoneinfo.converttime fromutc方法将日期时间转换为目标日期时间。目前在悉尼的UTC 10。如果我运行代码,则将其完美地转换为UTC 10。但是在1月,除昼夜节省时,它是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.澳大利亚夏季时间/E.澳大利亚标准时间"
est2 =" 23-05-2019 23:15:23/false/false/false/E.澳大利亚夏季时间/E.澳大利亚标准时间"
在这两种情况下,都增加了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/true/aus东部日光时间/aus东部标准时间"
est2 =; 23/05/2019 23:15:23/true/false/aus东部日光时间/aus东部标准时间"
我认为这是您所期望的。
顺便说一句,dateTime.isdaylightsavingtime((使用您的本地时区来确定时间是否在dst之内。在这里看它可能会误导它。
似乎.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(澳大利亚东部日光时间(。