@@ -53,6 +53,11 @@ public static string MapTimeZoneId (string id)
53
53
return "New Zealand Standard Time" ;
54
54
case "Europe/Athens" :
55
55
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" :
56
61
case "US/Eastern" :
57
62
return "Eastern Standard Time" ;
58
63
case "US/Central" :
@@ -63,18 +68,57 @@ public static string MapTimeZoneId (string id)
63
68
case "Australia/Melbourne" :
64
69
return "AUS Eastern Standard Time" ;
65
70
case "Europe/Brussels" :
71
+ case "Europe/Copenhagen" :
72
+ case "Europe/Paris" :
73
+ case "Europe/Madrid" :
66
74
return "Romance Standard Time" ;
67
75
case "Africa/Kinshasa" :
68
76
return "W. Central Africa Standard Time" ;
69
77
case "Europe/Rome" :
70
78
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" :
71
87
return "W. Europe Standard Time" ;
72
88
case "Canada/Eastern" :
73
89
return "Eastern Standard Time" ;
74
90
case "Asia/Tehran" :
75
91
return "Iran Standard Time" ;
76
92
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" :
77
98
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" ;
78
122
default :
79
123
Assert . Fail ( $ "No mapping defined for zone id '{ id } '") ;
80
124
return null ;
@@ -905,6 +949,218 @@ public void Bug_9664 ()
905
949
Assert . AreEqual ( new TimeSpan ( 0 , 0 , 0 ) , tzi . GetUtcOffset ( date ) ) ;
906
950
#endif
907
951
}
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
+ }
908
1164
}
909
1165
910
1166
[ TestFixture ]
0 commit comments