Cómo administrar las fechas y las horas incluye horario de verano

INTRODUCCIÓN

Los desarrolladores que escriben aplicaciones que manejan las fechas y horas pueden usar uno o más tecnologías que realizan la manipulación de fecha y manipulación de tiempo. En particular, cierta API del sistema operativo base, el tiempo de ejecución de C (CRT) y el de Microsoft.NET Framework pueden convertir o manipular las fechas y horas. Este artículo describe algunos de los conceptos generales que intervienen en la gestión de las fechas y horas. Además, en este artículo se describe el efecto de los cambios de horario de verano (DST) de 2007 sobre determinados productos y tecnologías.

Más información

Manipulación y almacenamiento de información de tiempo

Las marcas de tiempo son valores que especifican una combinación de fecha y hora. Aplicaciones que deben tratar las marcas de tiempo normalmente almacenan las marcas de hora en hora Universal coordinada (UTC). La ventaja de UTC es que la hora UTC es universal. UTC es no están sujetas a las zonas horarias local o al horario de verano. Sin embargo, UTC no es fácil de usar ni relevante para la mayoría de los usuarios. Aunque UTC es la opción obvia para almacenamiento de información, no es una buena elección para su presentación. Por lo tanto, la mayoría de las aplicaciones convierten hora UTC a hora local antes de mostrar la marca de tiempo para el usuario. Por ejemplo, el Explorador de Windows se aplica la zona horaria y la configuración de DST para la marca de hora UTC antes de mostrar las fechas y horas de archivos en un directorio del sistema de archivos de Windows NT (NTFS).

Conversión de hora UTC a hora local puede considerarse como aplicar dos desplazamientos. El primero es el desplazamiento de zona horaria y el segundo es el desplazamiento del horario de verano. Por lo tanto, hora local eficaz es hora UTC más un desplazamiento de zona horaria, además de desplazamiento de los DST aplicable. El desplazamiento de zona horaria es bastante sencillo. El equipo está configurado para una zona horaria determinada y esa zona horaria tiene un desplazamiento de hora UTC. Para determinar si debe aplicarse un desplazamiento de DST es mucho más complejo. Esta actividad se basa en muchas reglas que son complejas y dinámicas.

Recientemente han cambiado las reglas de DST complejas con DST 2007. A partir de 2007, los Estados Unidos ha adoptado nuevas fechas de inicio y nuevas fechas de final de DST. Además, es común para otros países y gobiernos rutinariamente cambiar las fechas de inicio y finalización para el horario de verano en zonas horarias que están bajo su control. En la siguiente sección describe los efectos de los cambios de DST 2007 en productos relacionados con el desarrollador.

Para obtener más información acerca de DST 2007, visite el siguiente sitio Web de Microsoft:

Efectos de DST 2007 en tecnologías relacionadas con el desarrollador

Windows

En Windows Update y Microsoft Update, las actualizaciones están disponibles que habilitar Windows para que aplique correctamente los cambios de DST 2007 y para los años siguientes. Después de aplicaron estas actualizaciones, Windows calcula correctamente las compensaciones actuales desde la hora UTC a hora local como el equipo pasa a través de horario de verano. Las compensaciones incluyen las de las API de base y de las API de red relacionados con el tiempo.

Para obtener más información, haga clic en el siguiente número de artículo para verlo en Microsoft Knowledge Base:

942763 diciembre de 2007 acumulativo de actualizaciones para Microsoft Windows sistemas operativos

En tiempo de ejecución de C (CRT)

El CRT también realiza conversiones de fecha y las traducciones de tiempo. Por lo tanto, el CRT también debe actualizarse para incluir las nuevas reglas de DST 2007. El CRT realiza su propio control de tiempo sólo cuando se establece la variable de entorno TZ o cuando se produce un error en una llamada de tiempo de API del sistema operativo subyacente. Las actualizaciones están disponibles para lo monitores CRT que se incluyen con cada versión de Microsoft Visual Studio y también para lo monitores CRT que se incluyen con Windows. Estas actualizaciones permiten el CRT continuar tratar correctamente las conversiones de horario de verano en zonas horarias de Estados Unidos.

.NET Framework

El.NET Framework se basa en las llamadas al sistema operativo subyacente. Por lo tanto, el comportamiento de la.NET Framework refleja el estado del sistema operativo subyacente. No se requiere ninguna actualización independiente.

Visual Studio .NET integra los entornos de desarrollo (IDE)

El IDE de .NET de Visual Studio se incluyen versiones 2002, 2003 y 2005 de Microsoft Visual C++, Microsoft Visual C# y Microsoft Visual Basic. Estos productos se ven afectados sólo porque incluyen el CRT. No se requiere ninguna actualización específicas del IDE.

Visual Studio 2005 Team Foundation Server

Visual Studio 2005 Team Foundation Server se basa en el sistema operativo subyacente para las conversiones de fecha y hora. Por lo tanto, Visual Studio 2005 Team Foundation Server exhibe el mismo comportamiento que el sistema operativo. Visual Studio 2005 Team Foundation Server también se basa en Microsoft SQL Server, SQL Server Reporting Services y Windows SharePoint Services. Los equipos deben actualizarse con las actualizaciones pertinentes para el sistema operativo, SQL Server y Windows SharePoint Services. Todas las actualizaciones relevantes se deben aplicar en todos los equipos afectados al mismo tiempo. No se requiere ninguna actualización independiente de Visual Studio 2005 Team Foundation Server.

Visual Studio 2005 Team System

Visual Studio 2005 Team System se ve afectado a través del sistema operativo, Visual Studio 2005 Team Foundation Server y CRT. No se requiere ninguna actualización independiente de Visual Studio 2005 Team System.

Visual SourceSafe

Para obtener más información acerca de los problemas del horario de verano de Visual SourceSafe en 2007, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

Problemas de 931804 visual SourceSafe del horario de verano en 2007

Tiempo de ejecución de Visual Basic 6.0

El tiempo de ejecución de Visual Basic 6.0 no se ve afectado.

Visual C++ 6.0

Visual C++ 6.0 ya no se admite.

Para obtener más información, visite el siguiente sitio Web de Microsoft:

Kit de desarrollo de Software (SDK) de Windows para Windows Vista



Este SDK incluye una versión de CRT que se ve afectado por los cambios de DST 2007. Como parte de la instalación de este SDK, puede instalar Visual Studio 2005 CRT en equipos que no tienen ya que la versión de CRT instalado. Si una versión más reciente de CRT ya está instalada, la instalación del SDK no sobrescribe esa versión más reciente. Al desinstala el SDK, la versión más reciente de CRT se deja en el equipo. Antes o después de instalar el SDK, puede instalar la actualización de CRT de Visual Studio 2005.

El SDK de Windows para Windows Vista también instala un conjunto de módulos de combinación (archivos .msm) para Visual Studio 2005 CRT para su redistribución de CRT como parte de las aplicaciones de C++ personalizadas. Una aplicación que implementa el CRT redistribuible en la carpeta de instalación de la aplicación debe implementar el CRT actualizada de la actualización de CRT de Visual Studio 2005 en lugar de los archivos .msm CRT de Windows SDK para Windows Vista. Una aplicación que implementa la actualización de CRT de Visual Studio 2005 redistribuible en la carpeta de instalación de Windows debe aplicar la actualización redistribuible de CRT de Visual Studio 2005 a esos equipos.

Platform SDK para Microsoft Windows Server 2003 R2

Este SDK incluye una versión de CRT que se ve afectado por los cambios de DST 2007. Los clientes deben seguir las notas de versión para este SDK y las actualizaciones de CRT de Visual Studio 2005 si son necesarios.

El.NET Framework 2.0 SDK

Este SDK incluye una versión de CRT que se ve afectado por los cambios de DST 2007. Como parte de la instalación de este SDK, puede instalar Visual Studio 2005 CRT en equipos que no tienen ya que la versión de CRT instalado. Si una versión más reciente de CRT ya está instalada, la instalación del SDK no sobrescribe esa versión más reciente. Al desinstala el SDK, la versión más reciente de CRT se deja en el equipo. Antes o después de instalar el SDK, puede instalar la actualización de CRT de Visual Studio 2005.

Conversión de hora local en Windows

Las aplicaciones normalmente convierten horas UTC en horas locales antes de mostrar al usuario información de hora y fecha. Windows proporciona varias API para aplicaciones que se utilizará para la manipulación de marca de hora.
  • La función GetSystemTime() y la función GetSystemTimeAsFileTime() obtienen la hora UTC actual en una estructura SYSTEMTIME o en una estructura FILETIME.
  • La función GetLocalTime() Obtiene la hora local actual en una estructura SYSTEMTIME.
  • La función GetTimeZoneInformation() Obtiene una estructura TIME_ZONE_INFORMATION que describe la zona horaria actual y la configuración de DST para el equipo.
  • La función SystemTimeToFileTime() y la función FileTimeToSystemTime() las referencias entre las estructuras SYSTEMTIME y FILETIME.
  • La función FileTimeToLocalFileTime() y la función LocalFileTimeToFileTime() convertirán y traducen una estructura FILETIME entre la hora UTC y la hora local mediante la zona horaria actual y la configuración de DST en el equipo.
  • La función SystemTimeToTzSpecificLocalTime() y la función TzSpecificTimeToSystemTime() convierten una marca de hora UTC en una estructura SYSTEMTIME en una estructura SYSTEMTIME local. Estas funciones utilizan una estructura TIME_ZONE_INFORMATION que especifica la fecha inicial y la fecha de finalización para el horario de verano. De forma predeterminada, las reglas de DST actuales se utilizan cuando no hay tal estructura se proporciona.
  • La función NetRemoteTOD() Obtiene la hora desde un servidor remoto mediante el uso de la información y la configuración del servidor.
Nota: La función FileTimeToLocalFileTime() y la función LocalFileTimeToFileTime() realizan la conversión entre la hora UTC y la hora local utilizando sólo la información de zona horaria actual y la información de horario de verano. Esta conversión se produce independientemente de la marca de hora que se va a convertir.

Para ver un ejemplo de este comportamiento en el Explorador de Windows, siga estos pasos en un equipo que se encuentra en una zona horaria que utiliza el horario de verano.

Tenga en cuenta que estos pasos requieren que cambie el reloj del sistema. Por lo tanto, debe salir de todas las aplicaciones, como aplicaciones de calendario, que pueden reaccionar ante estos cambios de tiempo antes de seguir estos pasos.
  1. Cambiar la fecha del equipo a un día de horario de verano. Por ejemplo, establecer la fecha a 1 de julio de 2006.
  2. En un directorio NTFS en el mismo equipo, cree un nuevo archivo de texto llamado Test.txt.
  3. Observe que la marca de tiempo en el archivo se muestra como sigue en el Explorador de Windows:
    7/1/2006 3:37pm
  4. Cambiar la fecha del equipo a un día sin cambio horario. Por ejemplo, establezca la fecha 1 de febrero de 2007.
  5. Actualizar la ventana Explorador de Windows.
  6. Observe que la marca de tiempo en el archivo se muestra como sigue en el Explorador de Windows:
    7/1/2006 2:37pm
En este ejemplo anterior, no cambia la marca de hora UTC en el archivo. Sin embargo, las reglas que se utilizan para convertir la marca de hora a una hora local cambian dependiendo de la fecha actual en el equipo. En el paso 3, se aplicó a un desplazamiento de DST porque el 1 de julio está dentro del intervalo de DST. En el paso 6, no se aplicó ningún desplazamiento de DST, porque el 1 de febrero no está dentro del intervalo del horario de verano. Este comportamiento se produce por lo que se puede convertir determinista la marca de hora del archivo a la hora local y hora local.

Para obtener más información, consulte este blog:El método SystemTimeToTzSpecificLocalTime() y el método TzSpecificTimeToSystemTime() conversión entre la hora UTC y la hora local mediante la estructura TIME_ZONE_INFORMATION proporcionada. Si no se proporciona ninguna información de zona horaria, estas funciones utilizan las reglas de zona horaria actual y las reglas de DST para determinar si un desplazamiento de DST se deben aplicar a la marca de tiempo. Esto es funcionalmente equivalente a llamar al método GetTimeZoneInformation() para obtener la estructura TIME_ZONE_INFORMATION que está actualmente en vigor.

La estructura TIME_ZONE_INFORMATION incluye la fecha de inicio y la fecha de finalización para el horario de verano. Por lo tanto, cuando la estructura TIME_ZONE_INFORMATION utiliza la información de zona horaria actual, en la estructura TIME_ZONE_INFORMATION puede introducir una inexactitud histórica. Este comportamiento puede producirse si la información de zona horaria actual y la información del horario de verano no reflejan la marca de hora que se va a convertir. Este comportamiento se ve afectado por el DST 2007 sólo porque han cambiado las reglas que rigen las fechas cuando el horario de verano inicia y detiene.

Para obtener conversiones históricamente precisas de estas funciones, una aplicación debe proporcionar una estructura TIME_ZONE_INFORMATION históricamente exacta cuando la aplicación llama a estas funciones.

Dinámicas zonas horarias de Windows

Windows Vista presenta las zonas horarias de dynamic DST. Dynamic DST proporciona compatibilidad para las zonas horarias cuyos límites para DST cambian año a año. Estas reglas se almacenan en el registro. Las aplicaciones pueden consultar las reglas mediante la función GetDynamicTimeZoneInformation() .

Zonas horarias dinámicas permiten más fácil actualización de equipos, especialmente para las configuraciones regionales donde los límites de horario de verano anuales se conocen de antemano. Para obtener más información acerca de la estructura DYNAMIC_TIME_ZONE_INFORMATION en el SDK de Windows para Vista, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):

Conversión de hora local en el tiempo de ejecución de C (CRT)

CRT básicamente tiene tres modos en los que pueden traducir las marcas de tiempo:
  • Si no se establece la variable de entorno TZ, el CRT llama a las API de Windows y comporta de Windows como se describe en este artículo.
  • Si se establece la variable de entorno TZ, el CRT realiza sus propia conversiones que se basan en ese valor. Se está actualizando el CRT para que respeta las nuevas reglas de DST 2007 cuando realiza conversiones en este escenario.
  • Si no se establece la variable de entorno TZ, pero los errores de las API de Windows subyacente, CRT utiliza sus propias conversiones mediante un valor de PST8PDT para la variable de entorno TZ.
CRT contiene su propia lógica para convertir una hora UTC a hora local. Aplicaciones pueden obtener las marcas de hora UTC de funciones como la función time() . Estas marcas de hora UTC se almacenan valores de time_t . Conversión a la hora local se puede realizar con una función como la función localtime_s() . La función localtime_s() rellena una estructura tm que se define en el archivo de encabezado Time.h. La estructura de tm se basa en la zona horaria que se define en la variable de entorno TZ y en las reglas de DST que están en vigor en el momento de la marca de tiempo.

Nota: Esta conversión sigue reglas específicas para los Estados Unidos.

Antes de aplicar la actualización de DST 2007, CRT controla correctamente las marcas de tiempo actual en las zonas horarias de Estados Unidos. Después de aplicar la actualización de DST 2007, CRT también controla el pasado y fechas futuras de Estados Unidos. Actualizaciones de CRT se enumeran en la sección "Referencias".

Conversión de hora local en el.NET Framework

El.NET Framework contiene clases que almacenan y convierten las marcas de tiempo. Estas clases incluyen la clase DateTime , la clase TimeZone , la clase TimeSpan y la clase DateTimeKind . Como se indicó anteriormente, estas clases se basan principalmente en la implementación de la plataforma subyacente. Estas clases presentan el mismo comportamiento que las API del sistema operativo subyacente.

Una interesante comportamiento expuesto por las clases de tiempo y las clases de.NET Framework fecha se refiere a las funciones que la marca de hora el desplazamiento por la cantidad solicitada. Por ejemplo, considere la función AddHours() , la función AddMinutes() y la función AddSeconds() en la clase DateTime . Estas funciones y funciones de nombre similar, simplemente incrementan la marca de tiempo en la cantidad solicitada, sin tener en cuenta para la configuración de horario de verano. Este comportamiento podría considerarse aritmética simple en la marca de hora UTC subyacente. Sin embargo, este comportamiento podría conducir a resultados inesperados cuando se agrega, la marca de hora pasar dentro o fuera del horario de verano. Este comportamiento está relacionado con los cambios de DST 2007.

Recomendaciones

Las recomendaciones siguientes pueden ayudar a los desarrolladores minimizar el efecto de DST 2007 y mejorar el control de tiempo y fecha general.
  • Debe planear una instalación atómica cerca de las actualizaciones de DST 2007. Todas las actualizaciones de DST 2007 planificadas deben aplicarse lo más cerca en el tiempo entre sí como sea posible. Si un equipo que se ha actualizado intenta utilizar métodos como consultas SQL o servicios Web para comunicarse con un equipo que no se ha actualizado, pueden producirse errores de traducción. De forma similar, si un equipo requiere dos o más actualizaciones, como Windows update y la actualización de CRT, las actualizaciones deben aplicarse al mismo tiempo.
  • Las marcas de hora UTC son históricamente precisos. Normalmente es la conversión a la hora local que se refiera a la mayoría de las aplicaciones. Las aplicaciones siempre deben almacenar las marcas de hora UTC. Las conversiones a la hora local para fines de presentación requieren información de zona horaria y horario de verano. Esta información puede provenir de diversos orígenes:
    • La aplicación puede utilizar la zona horaria actual y la configuración de DST para la conversión. Esto puede introducir una imprecisión en la conversión si la zona horaria actual y la configuración de DST no estaban en vigor en el momento de la marca de tiempo.
    • La aplicación puede almacenar la información de zona horaria precisa previamente y DST además de la marca de hora UTC.
    • Cuando existen zonas horarias dinámicas, pueda utilizar la aplicación dinámica de las zonas horarias para determinar qué información de zona horaria debe aplicarse a una determinada marca de hora UTC. Esta opción está disponible sólo cuando la información de zona horaria dinámicas está disponible para una marca de tiempo específico y para una zona horaria concreta.
    • La aplicación puede almacenar una marca de hora local y la marca de hora UTC. Este método evita la necesidad de conversión futura.
  • Cualquier comunicación entre equipos que se ocupan de las marcas de tiempo debe utilizar marcas de hora UTC. Implícitamente con ello ambos equipos la misma información de contexto para UTC.
  • Si una aplicación controla las fechas, debe ser cuidadoso con la forma en que se controlan las fechas en las pruebas. Las fechas que se muestran sin información de hora se almacenan normalmente como una marca de hora de 12:00 A.M. de la fecha pertinente. Por lo tanto, un error off-by-one en la parte de hora de la marca de tiempo puede provocar un resultado off-by-one en la fecha de vigencia si el tiempo se desplaza a 11:00 P.M. del día anterior.

Referencias

Para obtener más información sobre el portal de Microsoft de DST 2007, visite el siguiente sitio Web de Microsoft:http://support.microsoft.com/gp/cp_dstpara obtener más información, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:

942763 diciembre de 2007 acumulativo de actualizaciones para Microsoft Windows sistemas operativos

931975 cómo preparar SQL Server 2005 y SQL Server 2000 para cambios al horario de verano en 2007

Problemas de 931804 visual SourceSafe del horario de verano en 2007

Para obtener más información, visite los siguientes sitios Web de Microsoft Developer Network (MSDN):Para obtener actualizaciones de DST 2007 para el tiempo de ejecución de C (CRT), haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
CORREGIR 932305 : actualización de horario de verano de 2007 en tiempo de ejecución de Visual C++ .NET 2002 C para el problema de variable de entorno TZ

CORREGIR 932304 : actualización de horario de verano de 2007 en tiempo de ejecución de Visual C++ .NET 2002 Service Pack 1 C para el problema de variable de entorno TZ

CORREGIR 932299 : actualización de horario de verano de 2007 en tiempo de ejecución de Visual C++ .NET 2003 C para el problema de variable de entorno TZ

CORREGIR 932298 : actualización de horario de verano de 2007 en tiempo de ejecución de Visual C++ .NET 2003 Service Pack 1 C para el problema de variable de entorno TZ

CORREGIR 932392 : actualización de horario de verano de 2007 en tiempo de ejecución de Visual C++ .NET 2005 C para la variable de entorno TZ

CORREGIR 932391 : actualización de horario de verano de 2007 en tiempo de ejecución de Visual C++ .NET 2005 Service Pack 1 C para la variable de entorno TZ

CORREGIR 932590 : aplicaciones basadas en Windows que usan la variable de entorno TZ no funcionen como se esperaba debido a los cambios de horario de verano

Propiedades

Id. de artículo: 932955 - Última revisión: 14 ene. 2017 - Revisión: 1

Comentarios