2011-09-15 14 views
6

Soy nuevo en <time.h> y tengo una pregunta con respecto a time_t y .¿Es time_t devuelto por time() zona específica?

leí el tiempo de la función() documentado de la siguiente manera:

tiempo time_t (time_t * temporizador); Obtenga la 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 de la zona horaria.

Así, para el siguiente código C++:

time_t t = tiempo (NULL);

Si dos máquinas, una en Estados Unidos y el otro en el Reino Unido, tanto ejecutar la llamada a la función time(NULL), al mismo tiempo, será devuelto el time_t objetos idénticos?

¿Tiempo() devuelve un valor independientemente de la zona horaria?

Respuesta

6

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.

1

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

Wikipedia

+0

segundos, no en milisegundos. –

+0

¡Uy! Corregido, gracias! – Macondo2Seattle

2

Bueno, ha documentado para devolver un time_t - que es documented con:

es casi se espera que sea universalmente un valor integral que representa 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 en sentido estricto no se garantiza multiplataforma por lo que se ve, pero en la práctica puede ser tratados de una manera multiplataforma y está en UTC.

(Por supuesto, habrá múltiples fuentes de documentación para time_t para empezar ... No estoy seguro de qué es exactamente pueden considerarse definitivas aquí.)

2

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

1

De acuerdo con el último estándar del lenguaje de programación C emitida 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 calendario tiempo en términos de la norma represents the current date (according to the Gregorian calendar) and time en contraste con locales tiempo, 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: valores

  1. time_t devueltos por tiempo() de la biblioteca de C debe ser no zona de tiempo específica. 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 de 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() en su lugar para convertir time_t en struct tm y obtener acceso a los detalles de la marca de tiempo. Al menos, si su aplicación no se considera limitada solo por los sistemas * NIX.
0

Esto le dará su "época locales":

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