localtime_r libreria how current biblioteca c++ c time timezone

c++ - libreria - ¿Time_t es devuelto por time() zone specific?



libreria time c++ (6)

Solo soy nuevo en <time.h> y tengo una pregunta con respecto a time_t y time() .

Leí la función time () documentada de la siguiente manera:

time_t time (time_t * timer); Obtener hora actual

Obtenga el tiempo de calendario actual como un objeto time_t.

La función devuelve este valor, y si el argumento no es un puntero nulo, el valor también se establece en el objeto apuntado por el temporizador.

La documentación no habla sobre la zona horaria.

Por lo tanto, para el siguiente código de C ++:

time_t t = tiempo (NULL);

Si dos máquinas, una en EE. UU. Y la otra en el Reino Unido, ejecutan el time(NULL) llamada a la función time(NULL) al mismo tiempo, ¿los objetos time_t devueltos serán idénticos?

¿Time () devolverá un valor independientemente de la zona horaria?


Bueno, está documentado devolver un time_t , que está documentado con:

Se espera casi universalmente que sea un valor integral que represente el número de segundos transcurridos desde las 00:00 horas, 1 de enero de 1970 UTC. Esto se debe a razones históricas, ya que corresponde a una marca de tiempo de Unix, pero se implementa ampliamente en las bibliotecas de C en todas las plataformas.

Así que, estrictamente hablando, no se garantiza multiplataforma por su aspecto, pero en la práctica se puede tratar de forma multiplataforma y está en UTC.

(Por supuesto, habrá múltiples fuentes de documentación para time_t para comenzar ... No estoy seguro de qué se puede considerar definitivo aquí).


De acuerdo con el último estándar del lenguaje de programación C emitido en 2011:

1. The *time* function determines the current **calendar time**. 2. The encoding of the value is unspecified. 3. The *time* function returns the implementation’s best approximation to the current calendar time.

donde el tiempo calendario en términos del estándar represents the current date (according to the Gregorian calendar) and time en contraste con el horario local , que es the calendar time expressed for some specific time zone . Y The range and precision of times representable in clock_t and time_t are implementation-defined.

Como resultado:

  1. Los valores time_t devueltos por time () desde la biblioteca C no deben ser específicos de zona horaria. Si no es cierto, la implementación de la biblioteca C no cumple con el estándar y esta situación se puede considerar como un error en la biblioteca.
  2. codificación de valor time_t no especificada! Se puede especificar en el estándar POSIX, pero definitivamente no se especifica en el estándar C. Debido a esto, no debe confiar en los supuestos sobre sus detalles de implementación, como que cuenta el tiempo en la resolución de un segundo o que es un número entero que contiene el número de segundos transcurridos desde las 00:00 horas, 1 de enero de 1970 UTC. Use las funciones apropiadas de la biblioteca estándar C, como gmtime () y localtime () para convertir time_t en struct tm y obtenga acceso a los detalles de la marca de tiempo. Al menos, si su aplicación no se considera limitada solo por los sistemas * NIX.

Esto le dará su "época local":

time_t t = time(NULL); t = timegm(localtime(&t);


No, no es específico de la zona. Devuelve un valor que es un recuento de la cantidad de segundos desde el 1 de enero de 1970 en UTC, ignorando los segundos intercalares. Entonces (en principio) si dos máquinas ejecutan la llamada al mismo tiempo, el valor devuelto será el mismo, incluso si funcionan en dos zonas horarias separadas.


No; esta función devuelve el segundo conteo desde las 00:00:00 UTC del 1 de enero de 1970.

Wikipedia


time_t valores de time_t son independientes de las diferencias de zona horaria, ya que cuentan el tiempo de epoch . Si desea tener un tiempo de calendario local, puede tomar ese valor time_t y pasarlo a la función localtime() , que devuelve un puntero a struct tm con su hora local.