14to marzo y 7 de noviembre son siempre parte de la semana en que se producen los ahorros de luz en los Estados Unidos ... pueden ser el domingo o el sábado o el día de la semana en el medio, pero siempre son parte de esa semana. El siguiente código encontrará el domingo del que esas dos fechas forman parte en el año en el que aparece la fecha en cuestión. A continuación, agrega 2 horas a esta fecha para obtener el momento en que realmente ocurre el horario de verano. luego compara la fecha en cuestión con las fechas de inicio y finalización de ahorro de luz diurna y ajusta el tiempo por la compensación gmt. Este proceso puede funcionar para otras fechas de inicio y finalización en otros países. puede configurar una tabla que tenga todos los códigos de país y código postal con el horario de verano y las fechas de inicio y la compensación de GMT para ambos períodos. las fechas serían el 7, 14, 21 y 28, para los domingos primero a cuarto de un mes. pondría el día máximo para el último domingo del mes, ex 30 de septiembre o 31 de octubre.
segundo domingo de marzo:
cdate("3/14/" & format(now(),"yyyy"))-format(cdate("3/14/" & format(now(),"yyyy")),"W")+1+2/24
domingo 1 de noviembre:
cdate("11/7/" & format(now(),"yyyy"))-format(cdate("11/7/" & format(now(),"yyyy")),"W")+1+2/24
Ex.
If(now() < cdate("3/14/" & format(now(),"yyyy"))-format(cdate("3/14/" & format(now(),"yyyy")),"W")+1+2/24, dateadd("H",-5,now()), if(now() < cdate("11/7/" & format(now(),"yyyy"))-format(cdate("11/7/" & format(now(),"yyyy")),"W")+1+2/24, dateadd("H",-6,now()), dateadd("H",-5,now())))
T_SQL ejemplo
CASO CUANDO [date2check] < DATEADD (hh, 2, CAST ('3/14 /' + CAST (DATEPART (aaaa, [date2check]) AS nvarchar (4)) AS datetime) + 1 - DATEPART (w, CAST ('3/14 /' + CAST (DATEPART (aaaa, [date2check]) AS nvarchar (4)) AS datetime))) ENTONCES dateadd (hh, - DST_GMT_TM_ZN_DIFF, [date2check]) CASE ELSE Cuando [date2check] < DATEADD (hh, 2, CAST ('11/7 /' + CAST (DATEPART (aaaa, [date2check]) AS nvarchar (4)) AS de fecha y hora) + 1 - DATEPART (w, CAST ('11/7/'+ CAST (DATEPART (aaaa, [date2check]) AS nvarchar (4)) AS de fecha y hora))) ENTONCES dateadd (hh, - STD_GMT_TM_ZN_DIFF, [date2check]) ELSE dateadd (hh, - DST_GMT_TM_ZN_DIFF, [date2check]) FIN FIN
Si ese código realmente concuerda con 'TimeZone.IsDayLightSavingsTime()' para todas las fechas de 1800 a 2006, entonces 'TimeZone.IsDayLightSavingsTime()' está roto. El horario de verano no existía a nivel nacional en los EE. UU. Hasta 1966 (a excepción de ciertos períodos durante las dos guerras mundiales). Y hasta 2007, comenzó el primer domingo de abril y terminó el último domingo de octubre, a excepción de un período en 1974-1975 cuando el DST funcionó durante todo el año. – Anomie
La documentación dice que no es histórico. Solo aplica la regla para la cultura actual. Hay otra instalación para obtener datos históricos precisos. – captncraig
Entonces, al menos, el quebranto está documentado. – Anomie