Como algunos sitios web que convertir esos unix time stamps decir, el sello de

2013/05/07 05:01:00 (yyyy/mm/dd, hh:mm:ss) is 1367902860.

La manera en que lo hago en C++, el sello difiere de la fecha.
Aquí está el código:

time_t rawtime;
struct tm * timeinfo;

int year=2013, month=5, day=7, hour = 5, min = 1, sec = 0;

/* get current timeinfo: */
time ( &rawtime ); //or: rawtime = time(0);
/* convert to struct: */
timeinfo = localtime ( &rawtime ); 

/* now modify the timeinfo to the given date: */
timeinfo->tm_year   = year - 1900;
timeinfo->tm_mon    = month - 1;    //months since January - [0,11]
timeinfo->tm_mday   = day;          //day of the month - [1,31] 
timeinfo->tm_hour   = hour;         //hours since midnight - [0,23]
timeinfo->tm_min    = min;          //minutes after the hour - [0,59]
timeinfo->tm_sec    = sec;          //seconds after the minute - [0,59]

/* call mktime: create unix time stamp from timeinfo struct */
date = mktime ( timeinfo );

printf ("Until the given date, since 1970/01/01 %i seconds have passed.\n", date);

La resultante de sello de tiempo es

1367899260, but not 1367902860.

¿Cuál es el problema aquí? Incluso si tengo que cambiar a hora-1 hora+1, no coincide. EDIT: Bueno, sí, si puedo añadir de 1 a hora, funciona. anteriormente también se agrega 1 a los minutos.

InformationsquelleAutor user2366975 | 2014-02-10

5 Comentarios

  1. 1

    ¿Tiene el horario de verano cuando eres? El tm::tm_isdst parámetro es un indicador para el horario de verano. Este va a ser llenados por el localtime llamada, en función de donde está y de la época del año y usted no se restablece. Así que incluso si el usuario y la página web están utilizando el mismo tiempo, si usted tiene el horario de verano marca y la página web no entonces el resultado final será diferente por 1 hora.

    Nota que usted realmente no necesita la localtime llamada. Que sólo puede llenar en todas las partes de forma manual debido a tm::tm_wday y tm::tm_yday son ignorados por la función mktime. Echa un vistazo http://www.cplusplus.com/reference/ctime/tm/ y http://www.cplusplus.com/reference/ctime/mktime/

  2. 0

    No utilizar un puntero a localtime. Guardar el valor real

    struct tm timeinfo;
    ...
    timeinfo = *localtime(&rawtime);
    ...
    date = mktime(&timeinfo);

    No sé qué otra cosa se puede utilizar el puntero que localtime está regresando. la función mktime posiblemente podría ser el uso de la misma.

    • Buena idea, pero eso no cambia nada.
  3. 0

    Parece que el sitio web está suponiendo que el tiempo está en la zona horaria UTC, y su equipo está configurado para alguna otra zona horaria.

    Puede llamar gmtime en lugar de localtime a usar UTC por eso; pero me he dado cuenta que usted no está utilizando realmente localtime hacer nada excepto obtener un puntero a un tm. Usted sería mejor declarar un local tm; el utilizado por localtime podría ser reutilizados siempre que llame otra vez la función de librería.

    Lamentablemente, no hay un estándar de la variación de mktime utiliza UTC. Si desea UTC, sus opciones son:

    • Establecer la zona horaria usando setenv("TZ", "", 1);. Tenga en cuenta que esto afecta a la totalidad del programa, así que puede ser difícil si usted también debe lidiar con la hora local.
    • El uso de una biblioteca como Boost.DateTime, que es ligeramente mejor en el manejo de las fechas y el horario de la biblioteca de C.
    • He cambiado a timeinfo = gmtime ( &rawtime); y el resultado sigue siendo el mismo.
    • Oh, sí, mktime va a asumir la hora local, y no tiene un UTC versión.
  4. 0

    mktime() convierte local tiempo de calendario a un tiempo, desde la época como un time_t objeto, por lo que su resultado será diferente de la del sitio web si usted está en un momento diferente de la zona. El sitio web tiene 2013/05/07 05:01:00 como la hora UTC. El mismo código en mi máquina tiene un resultado de 1367874060, que es de 8 horas fuera de la página web del valor. Estoy en UTC+8:00 de la zona horaria, por lo que mktime() en mi máquina toma la entrada 2013/05/07 05:01:00 como UTC+8:00 de tiempo, lo que provoca la diferencia.

    PS: localtime() devuelve un puntero a una estática interna struct tm objeto. La estructura puede ser compartida entre gmtime(), localtime(), y ctime(), y puede ser sobrescrita en cada invocación. Así que es una mejor práctica para tener su propia copia local de un struct tm objeto.

Dejar respuesta

Please enter your comment!
Please enter your name here