Skip to content

Commit 21b58c9

Browse files
MaximLipninscott-ferguson-unity
authored andcommitted
Fix time zone issue when jumping into DST (mono#16430)
Addresses an issue with jumping into DST for some time zones when the incorrect date-time offset is returned for date-time in UTC (which comes from DateTime.Now). The fix is to just check if the incoming date-time is in UTC. Also added a set of tests for some time zones to verify jumping into DST in general. Fixes mono#16395
1 parent 93b75f9 commit 21b58c9

File tree

2 files changed

+261
-2
lines changed

2 files changed

+261
-2
lines changed

mcs/class/corlib/System/TimeZoneInfo.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1252,10 +1252,13 @@ private bool TryGetTransitionOffset (DateTime dateTime, out TimeSpan offset, out
12521252
return false;
12531253
}
12541254

1255+
var isUtc = false;
12551256
if (dateTime.Kind != DateTimeKind.Utc) {
12561257
if (!TryAddTicks (date, -BaseUtcOffset.Ticks, out date, DateTimeKind.Utc))
12571258
return false;
1258-
}
1259+
} else
1260+
isUtc = true;
1261+
12591262

12601263
AdjustmentRule current = GetApplicableRule (date);
12611264
if (current != null) {
@@ -1267,7 +1270,7 @@ private bool TryGetTransitionOffset (DateTime dateTime, out TimeSpan offset, out
12671270
if (forOffset)
12681271
isDst = true;
12691272
offset = baseUtcOffset;
1270-
if (date >= new DateTime (tStart.Ticks + current.DaylightDelta.Ticks, DateTimeKind.Utc))
1273+
if (isUtc || (date >= new DateTime (tStart.Ticks + current.DaylightDelta.Ticks, DateTimeKind.Utc)))
12711274
{
12721275
offset += current.DaylightDelta;
12731276
isDst = true;

mcs/class/corlib/Test/System/TimeZoneInfoTest.cs

Lines changed: 256 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ public static string MapTimeZoneId (string id)
5353
return "New Zealand Standard Time";
5454
case "Europe/Athens":
5555
return "GTB Standard Time";
56+
case "Europe/Chisinau":
57+
return "E. Europe Standard Time";
58+
case "America/New_York":
59+
return "Eastern Standard Time";
60+
case "America/Chicago":
5661
case "US/Eastern":
5762
return "Eastern Standard Time";
5863
case "US/Central":
@@ -63,18 +68,57 @@ public static string MapTimeZoneId (string id)
6368
case "Australia/Melbourne":
6469
return "AUS Eastern Standard Time";
6570
case "Europe/Brussels":
71+
case "Europe/Copenhagen":
72+
case "Europe/Paris":
73+
case "Europe/Madrid":
6674
return "Romance Standard Time";
6775
case "Africa/Kinshasa":
6876
return "W. Central Africa Standard Time";
6977
case "Europe/Rome":
7078
case "Europe/Vatican":
79+
case "Europe/Vienna":
80+
case "Europe/Berlin":
81+
case "Europe/Luxembourg":
82+
case "Europe/Malta":
83+
case "Europe/Monaco":
84+
case "Europe/Amsterdam":
85+
case "Europe/Oslo":
86+
case "Europe/San_Marino":
7187
return "W. Europe Standard Time";
7288
case "Canada/Eastern":
7389
return "Eastern Standard Time";
7490
case "Asia/Tehran":
7591
return "Iran Standard Time";
7692
case "Europe/Guernsey":
93+
case "Europe/Dublin":
94+
case "Europe/Isle_of_Man":
95+
case "Europe/Jersey":
96+
case "Europe/Lisbon":
97+
case "Europe/London":
7798
return "GMT Standard Time";
99+
case "America/Havana":
100+
return "Cuba Standard Time";
101+
case "America/Anchorage":
102+
return "Alaskan Standard Time";
103+
case "Atlantic/Azores":
104+
return "Azores Standard Time";
105+
case "Asia/Jerusalem":
106+
return "Israel Standard Time";
107+
case "Asia/Amman":
108+
return "Jordan Standard Time";
109+
case "Europe/Tirane":
110+
case "Europe/Warsaw":
111+
return "Central European Standard Time";
112+
case "Europe/Sofia":
113+
case "Europe/Tallinn":
114+
case "Europe/Riga":
115+
case "Europe/Vilnius":
116+
case "Europe/Kiev":
117+
return "FLE Standard Time";
118+
case "Europe/Prague":
119+
case "Europe/Budapest":
120+
case "Europe/Bratislava":
121+
return "Central Europe Standard Time";
78122
default:
79123
Assert.Fail ($"No mapping defined for zone id '{id}'");
80124
return null;
@@ -905,6 +949,218 @@ public void Bug_9664 ()
905949
Assert.AreEqual (new TimeSpan (0, 0, 0), tzi.GetUtcOffset (date));
906950
#endif
907951
}
952+
953+
[Test]
954+
public void Bug_16395 ()
955+
{
956+
// Cuba, Havana (Cuba Standard Time): Jumps ahead at 12:00 AM on 3/8/2020 to 1:00 AM
957+
CheckJumpingIntoDST ("America/Havana",
958+
new DateTime (2020, 3, 8, 0, 0, 0), new DateTime (2020, 3, 8, 0, 30, 0), new DateTime (2020, 3, 8, 1, 0, 0),
959+
new TimeSpan (-5, 0, 0), new TimeSpan (-4, 0, 0));
960+
961+
// US, Kansas City, MO (US Central Time): Jumps ahead at 2:00 AM on 3/8/2020 to 3:00 AM
962+
CheckJumpingIntoDST ("America/Chicago",
963+
new DateTime (2020, 3, 8, 2, 0, 0), new DateTime (2020, 3, 8, 2, 30, 0), new DateTime (2020, 3, 8, 3, 0, 0),
964+
new TimeSpan (-6, 0, 0), new TimeSpan (-5, 0, 0));
965+
966+
// Anchorage, AK (Alaska Time): Jumps ahead at 2:00 AM on 3/8/2020 to 3:00 AM
967+
CheckJumpingIntoDST ("America/Anchorage",
968+
new DateTime (2020, 3, 8, 2, 0, 0), new DateTime (2020, 3, 8, 2, 30, 0), new DateTime (2020, 3, 8, 3, 0, 0),
969+
new TimeSpan (-9, 0, 0), new TimeSpan (-8, 0, 0));
970+
971+
// Azores ST (Ponta Delgada, Portugal): Jumps ahead at 12:00 AM on 3/29/2020 to 1:00 AM
972+
CheckJumpingIntoDST ("Atlantic/Azores",
973+
new DateTime (2020, 3, 29, 0, 0, 0), new DateTime (2020, 3, 29, 0, 30, 0), new DateTime (2020, 3, 29, 1, 0, 0),
974+
new TimeSpan (-1, 0, 0), new TimeSpan (0, 0, 0));
975+
976+
// Iran, Tehran (Iran ST): Jumps ahead at 12:00 AM on 3/21/2020 to 1:00 AM
977+
CheckJumpingIntoDST ("Asia/Tehran",
978+
new DateTime (2020, 3, 21, 0, 0, 0), new DateTime (2020, 3, 21, 0, 30, 0), new DateTime (2020, 3, 21, 1, 0, 0),
979+
new TimeSpan (3, 30, 0), new TimeSpan (4, 30, 0));
980+
981+
// Israel, Jerusalem (Israel ST): Jumps ahead at 2:00 AM on 3/27/2020 to 3:00 AM
982+
CheckJumpingIntoDST ("Asia/Jerusalem",
983+
new DateTime (2020, 3, 27, 2, 0, 0), new DateTime (2020, 3, 27, 2, 30, 0), new DateTime (2020, 3, 27, 3, 0, 0),
984+
new TimeSpan (2, 0, 0), new TimeSpan (3, 0, 0));
985+
986+
// Jordan, Amman (Eastern European ST): Jumps ahead at 12:00 AM on 3/27/2020 to 1:00 AM
987+
CheckJumpingIntoDST ("Asia/Amman",
988+
new DateTime (2020, 3, 27, 0, 0, 0), new DateTime (2020, 3, 27, 0, 30, 0), new DateTime (2020, 3, 27, 1, 0, 0),
989+
new TimeSpan (2, 0, 0), new TimeSpan (3, 0, 0));
990+
991+
// Albania, Tirana (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
992+
CheckJumpingIntoDST ("Europe/Tirane",
993+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
994+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
995+
996+
// Austria, Vienna (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
997+
CheckJumpingIntoDST ("Europe/Vienna",
998+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
999+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1000+
1001+
// Belgium, Brussels (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1002+
CheckJumpingIntoDST ("Europe/Brussels",
1003+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1004+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1005+
1006+
// Bulgaria, Sofia (Eastern European ST): Jumps ahead at 3:00 AM on 3/29/2020 to 4:00 AM
1007+
CheckJumpingIntoDST ("Europe/Sofia",
1008+
new DateTime (2020, 3, 29, 3, 0, 0), new DateTime (2020, 3, 29, 3, 30, 0), new DateTime (2020, 3, 29, 4, 0, 0),
1009+
new TimeSpan (2, 0, 0), new TimeSpan (3, 0, 0));
1010+
1011+
// Czechia, Prague (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1012+
CheckJumpingIntoDST ("Europe/Prague",
1013+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1014+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1015+
1016+
// Denmark, Copenhagen (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1017+
CheckJumpingIntoDST ("Europe/Copenhagen",
1018+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1019+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1020+
1021+
// Estonia, Tallinn (Eastern European ST): Jumps ahead at 3:00 AM on 3/29/2020 to 4:00 AM
1022+
CheckJumpingIntoDST ("Europe/Tallinn",
1023+
new DateTime (2020, 3, 29, 3, 0, 0), new DateTime (2020, 3, 29, 3, 30, 0), new DateTime (2020, 3, 29, 4, 0, 0),
1024+
new TimeSpan (2, 0, 0), new TimeSpan (3, 0, 0));
1025+
1026+
// France, Paris (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1027+
CheckJumpingIntoDST ("Europe/Paris",
1028+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1029+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1030+
1031+
// Germany, Berlin (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1032+
CheckJumpingIntoDST ("Europe/Berlin",
1033+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1034+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1035+
1036+
// Greece, Athens (Eastern European ST): Jumps ahead at 3:00 AM on 3/29/2020 to 4:00 AM
1037+
CheckJumpingIntoDST ("Europe/Athens",
1038+
new DateTime (2020, 3, 29, 3, 0, 0), new DateTime (2020, 3, 29, 3, 30, 0), new DateTime (2020, 3, 29, 4, 0, 0),
1039+
new TimeSpan (2, 0, 0), new TimeSpan (3, 0, 0));
1040+
1041+
// Guernsey (UK) Jumps ahead at 1:00 AM on 3/29/2020 to 2:00 AM
1042+
CheckJumpingIntoDST ("Europe/Guernsey",
1043+
new DateTime (2020, 3, 29, 1, 0, 0), new DateTime (2020, 3, 29, 1, 30, 0), new DateTime (2020, 3, 29, 2, 0, 0),
1044+
new TimeSpan (0, 0, 0), new TimeSpan (1, 0, 0));
1045+
1046+
// Holy See, Vatican City (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1047+
CheckJumpingIntoDST ("Europe/Vatican",
1048+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1049+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1050+
1051+
// Hungary, Budapest (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1052+
CheckJumpingIntoDST ("Europe/Budapest",
1053+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1054+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1055+
1056+
// // Ireland, Dublin (Greenwich Mean Time -> Irish Standard Time): Jumps ahead at 1:00 AM on 3/29/2020 to 2:00 AM
1057+
// CheckJumpingIntoDST ("Europe/Dublin",
1058+
// new DateTime (2020, 3, 29, 1, 0, 0), new DateTime (2020, 3, 29, 1, 30, 0), new DateTime (2020, 3, 29, 2, 0, 0),
1059+
// new TimeSpan (0, 0, 0), new TimeSpan (1, 0, 0));
1060+
1061+
// UK, Douglas, Isle of Man (GMT+1:00): Jumps ahead at 1:00 AM on 3/29/2020 to 2:00 AM
1062+
CheckJumpingIntoDST ("Europe/Isle_of_Man",
1063+
new DateTime (2020, 3, 29, 1, 0, 0), new DateTime (2020, 3, 29, 1, 30, 0), new DateTime (2020, 3, 29, 2, 0, 0),
1064+
new TimeSpan (0, 0, 0), new TimeSpan (1, 0, 0));
1065+
1066+
// Italy, Rome (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1067+
CheckJumpingIntoDST ("Europe/Rome",
1068+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1069+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1070+
1071+
// Jersey (UK): Jumps ahead at 1:00 AM on 3/29/2020 to 2:00 AM
1072+
CheckJumpingIntoDST ("Europe/Jersey",
1073+
new DateTime (2020, 3, 29, 1, 0, 0), new DateTime (2020, 3, 29, 1, 30, 0), new DateTime (2020, 3, 29, 2, 0, 0),
1074+
new TimeSpan (0, 0, 0), new TimeSpan (1, 0, 0));
1075+
1076+
// Latvia, Riga (Eastern European ST): Jumps ahead at 3:00 AM on 3/29/2020 to 4:00 AM
1077+
CheckJumpingIntoDST ("Europe/Riga",
1078+
new DateTime (2020, 3, 29, 3, 0, 0), new DateTime (2020, 3, 29, 3, 30, 0), new DateTime (2020, 3, 29, 4, 0, 0),
1079+
new TimeSpan (2, 0, 0), new TimeSpan (3, 0, 0));
1080+
1081+
// Lithuania, Vilnius (Eastern European ST): Jumps ahead at 3:00 AM on 3/29/2020 to 4:00 AM
1082+
CheckJumpingIntoDST ("Europe/Vilnius",
1083+
new DateTime (2020, 3, 29, 3, 0, 0), new DateTime (2020, 3, 29, 3, 30, 0), new DateTime (2020, 3, 29, 4, 0, 0),
1084+
new TimeSpan (2, 0, 0), new TimeSpan (3, 0, 0));
1085+
1086+
// Luxembourg, Luxembourg (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1087+
CheckJumpingIntoDST ("Europe/Luxembourg",
1088+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1089+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1090+
1091+
// Malta, Valletta (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1092+
CheckJumpingIntoDST ("Europe/Malta",
1093+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1094+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1095+
1096+
// Moldova, Chişinău (Eastern European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1097+
CheckJumpingIntoDST ("Europe/Chisinau",
1098+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1099+
new TimeSpan (2, 0, 0), new TimeSpan (3, 0, 0));
1100+
1101+
// Monaco, Monaco (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1102+
CheckJumpingIntoDST ("Europe/Monaco",
1103+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1104+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1105+
1106+
// Netherlands, Amsterdam (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1107+
CheckJumpingIntoDST ("Europe/Amsterdam",
1108+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1109+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1110+
1111+
// Norway, Oslo (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1112+
CheckJumpingIntoDST ("Europe/Oslo",
1113+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1114+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1115+
1116+
// Poland, Warsaw (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1117+
CheckJumpingIntoDST ("Europe/Warsaw",
1118+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1119+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1120+
1121+
// Portugal, Lisbon (Western European ST): Jumps ahead at 1:00 AM on 3/29/2020 to 2:00 AM
1122+
CheckJumpingIntoDST ("Europe/Lisbon",
1123+
new DateTime (2020, 3, 29, 1, 0, 0), new DateTime (2020, 3, 29, 1, 30, 0), new DateTime (2020, 3, 29, 2, 0, 0),
1124+
new TimeSpan (0, 0, 0), new TimeSpan (1, 0, 0));
1125+
1126+
// San Marino, San Marino (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1127+
CheckJumpingIntoDST ("Europe/San_Marino",
1128+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1129+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1130+
1131+
// Slovakia, Bratislava (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1132+
CheckJumpingIntoDST ("Europe/Bratislava",
1133+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1134+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1135+
1136+
// Spain, Madrid (Central European ST): Jumps ahead at 2:00 AM on 3/29/2020 to 3:00 AM
1137+
CheckJumpingIntoDST ("Europe/Madrid",
1138+
new DateTime (2020, 3, 29, 2, 0, 0), new DateTime (2020, 3, 29, 2, 30, 0), new DateTime (2020, 3, 29, 3, 0, 0),
1139+
new TimeSpan (1, 0, 0), new TimeSpan (2, 0, 0));
1140+
1141+
// Ukraine, Kiev (Eastern European ST): Jumps ahead at 3:00 AM on 3/29/2020 to 4:00 AM
1142+
CheckJumpingIntoDST ("Europe/Kiev",
1143+
new DateTime (2020, 3, 29, 3, 0, 0), new DateTime (2020, 3, 29, 3, 30, 0), new DateTime (2020, 3, 29, 4, 0, 0),
1144+
new TimeSpan (2, 0, 0), new TimeSpan (3, 0, 0));
1145+
1146+
// United Kingdom, London (British ST): Jumps ahead at 1:00 AM on 3/29/2020 to 2:00 AM
1147+
CheckJumpingIntoDST ("Europe/London",
1148+
new DateTime (2020, 3, 29, 1, 0, 0), new DateTime (2020, 3, 29, 1, 30, 0), new DateTime (2020, 3, 29, 2, 0, 0),
1149+
new TimeSpan (0, 0, 0), new TimeSpan (1, 0, 0));
1150+
}
1151+
1152+
void CheckJumpingIntoDST (string tzId, DateTime dstDeltaStart, DateTime inDstDelta, DateTime dstDeltaEnd, TimeSpan baseOffset, TimeSpan dstOffset)
1153+
{
1154+
var tzi = TimeZoneInfo.FindSystemTimeZoneById (MapTimeZoneId (tzId));
1155+
Assert.IsFalse (tzi.IsDaylightSavingTime (dstDeltaStart), $"{tzId}: #1");
1156+
Assert.AreEqual (baseOffset, tzi.GetUtcOffset (dstDeltaStart), $"{tzId}: #2");
1157+
1158+
Assert.IsFalse (tzi.IsDaylightSavingTime (inDstDelta), $"{tzId}: #3");
1159+
Assert.AreEqual (baseOffset, tzi.GetUtcOffset (inDstDelta), $"{tzId}: #4");
1160+
1161+
Assert.IsTrue (tzi.IsDaylightSavingTime (dstDeltaEnd), $"{tzId}: #5");
1162+
Assert.AreEqual (dstOffset, tzi.GetUtcOffset (dstDeltaEnd), $"{tzId}: #6");
1163+
}
9081164
}
9091165

9101166
[TestFixture]

0 commit comments

Comments
 (0)