_mkgmtime, _mkgmtime32, _mkgmtime64
Converte un'ora UTC rappresentata da tm struct nell'ora UTC rappresentata da un tipo di time_t.
time_t _mkgmtime(
struct tm* timeptr
);
__time32_t _mkgmtime32(
struct tm* timeptr
);
__time64_t _mkgmtime64(
struct tm* timeptr
);
Parametri
- timeptr
Un puntatore all'ora UTC come struct tm da convertire.
Valore restituito
Una quantità di tipo __time32_t o __time64_t che rappresenta il numero di secondi trascorsi dalla mezzanotte, il 1° gennaio 1970, al momento dell'ora UTC (Coordinated Universal Time). Se è inclusa (vedere la sezione relativa alle osservazioni) o l'input non può essere interpretato come ora valido, il valore restituito sarà - 1.
Note
Le funzioni _mkgmtime64 e _mkgmtime32 convertono l'ora UTC in un tipo di __time64_t o di __time32_t che rappresenta l'ora UTC. Per convertire l'ora locale in ora UTC, utilizzare invece mktime, _mktime32 e _mktime64.
_mkgmtime è una funzione inline che valuta _mkgmtime64, e time_t equivale a __time64_t. Se è necessario forzare il compilatore ad interpretare time_tcome il vecchio 32 bit time_t, è possibile definire _USE_32BIT_TIME_T. Questa operazione non è consigliabile perché l'applicazione potrebbe non riuscire dopo il 19 gennaio 2038 (l'intervallo massimo pari a 32 bit time_t) e non è consentita alcuna delle piattaforme a 64 bit.
La struttura di tempo passata viene modificata come segue, ad esempio vengono modificate con le funzioni _mktime : i campi di tm_yday e di tm_wday sono impostati sui nuovi valori basati sui valori di tm_mday e di tm_year. Quando si specifica un'ora della struttura di tm, impostare il campo di tm_isdst :
Zero (0) per indicare che è in vigore l'ora standard.
Un valore maggiore di 0 indica che è in vigore l'ora legale.
Un valore minore di zero per fare in modo che il codice della libreria di runtime del linguaggio C determini se è in vigore l'ora standard oppure l'ora legale.
La libreria di runtime C utilizza la variabile di ambiente TZ per determinare il tempo corretto dell'ora legale del giorno. Se TZ non è impostato, il sistema operativo esegue una query per ottenere l'orario regionale corretto salvando il comportamento dell'orario. tm_isdst è un campo obbligatorio. Se non è impostato, il valore è indefinito ed il valore restituito da mktime è imprevedibile.
L'intervallo della funzione _mkgmtime32 è dalla mezzanotte, il 1° gennaio 1970, UTC fino al 19 gennaio, 3:14: 07, 2038, UTC. L'intervallo di _mkgmtime64 proviene dalla mezzanotte, il 1° gennaio 1970, UTC fino alle 23:59:59, il 31 dicembre, 3000, UTC. Risultati relativi alla data esterni all'intervallo restituiscono un valore -1. L'intervallo di _mkgmtime varia a seconda che _USE_32BIT_TIME_T è definito. Se non è definito (impostazione predefinita) l'intervallo è quello di _mkgmtime64; in caso contrario, l'intervallo è limitato all'intervallo di 32 bit di _mkgmtime32.
Da notare che gmtime e localtime utilizzano un solo buffer allocato in modo statico per la conversione. Se si fornisce questo buffer a mkgmtime, i contenuti precedenti vengono eliminati in modo permanente.
Esempio
// crt_mkgmtime.c
#include <stdio.h>
#include <time.h>
int main()
{
struct tm t1, t2;
time_t now, mytime, gmtime;
char buff[30];
time( & now );
_localtime64_s( &t1, &now );
_gmtime64_s( &t2, &now );
mytime = mktime(&t1);
gmtime = _mkgmtime(&t2);
printf("Seconds since midnight, January 1, 1970\n");
printf("My time: %I64d\nGM time (UTC): %I64d\n\n", mytime, gmtime);
/* Use asctime_s to display these times. */
_localtime64_s( &t1, &mytime );
asctime_s( buff, sizeof(buff), &t1 );
printf( "Local Time: %s\n", buff );
_gmtime64_s( &t2, &gmtime );
asctime_s( buff, sizeof(buff), &t2 );
printf( "Greenwich Mean Time: %s\n", buff );
}
Esempio di output
Seconds since midnight, January 1, 1970
My time: 1171588492
GM time (UTC): 1171588492
Local Time: Thu Feb 15 17:14:52 2007
Greenwich Mean Time: Fri Feb 16 01:14:52 2007
Nell'esempio seguente viene illustrata la struttura incompleta viene compilata di valori calcolati del giorno, della settimana e del giorno dell'anno.
// crt_mkgmtime2.c
#include <stdio.h>
#include <time.h>
#include <memory.h>
int main()
{
struct tm t1, t2;
time_t gmtime;
char buff[30];
memset(&t1, 0, sizeof(struct tm));
memset(&t2, 0, sizeof(struct tm));
t1.tm_mon = 1;
t1.tm_isdst = 0;
t1.tm_year = 103;
t1.tm_mday = 12;
// The day of the week and year will be incorrect in the output here.
asctime_s( buff, sizeof(buff), &t1);
printf("Before calling _mkgmtime, t1 = %s t.tm_yday = %d\n",
buff, t1.tm_yday );
gmtime = _mkgmtime(&t1);
// The correct day of the week and year were determined.
asctime_s( buff, sizeof(buff), &t1);
printf("After calling _mkgmtime, t1 = %s t.tm_yday = %d\n",
buff, t1.tm_yday );
}
Output
Before calling _mkgmtime, t1 = Sun Feb 12 00:00:00 2003
t.tm_yday = 0
After calling _mkgmtime, t1 = Wed Feb 12 00:00:00 2003
t.tm_yday = 42
Vedere anche
Riferimenti
gmtime_s, _gmtime32_s, _gmtime64_s