mktime、_mktime32、_mktime64
將當地時間轉換成月曆值。
time_t mktime( struct tm *timeptr ); __time32_t _mktime32( struct tm *timeptr ); __time64_t _mktime64( struct tm *timeptr );
參數
- timeptr
時間結構的指標,請參閱 asctime。
傳回值
_mktime32 會傳回指定的月曆時間,並編碼為 time_t 類型的值。 若 timeptr 參考的日期是在 1970 年 1 月 1 日的午夜之前,或是無法表示月曆時間,則 _mktime32 會傳回 –1 並轉換為類型 time_t。 使用 _mktime32 時,若 timeptr 參考的日期是在 2038 年 1 月 19 日 03:14:07 國際標準時間 (UTC) 之後,則會傳回 –1 並轉換為類型 time_t。
若 timeptr 參考的日期是在 3000 年 12 月 31 日 23:59:59 (UTC) 之後,_mktime64 會傳回 –1 並轉換為類型 __time64_t。
備註
mktime、_mktime32 和 _mktime64 函式會將 timeptr 所指向的指定時間結構 (可能不完整),轉換為具有標準化值的完整定義結構,然後將該結構轉換為 time_t 月曆時間值。 轉換後的時間和 time 函式傳回的值具有相同的編碼。 會忽略 timeptr 結構中 tm_wday 和 tm_yday 元件的原始值,且不會限制其他元件的原始值在其正確範圍中。
mktime 是相當於 _mktime64 的內嵌函式,但若有定義 _USE_32BIT_TIME_T 時,則是相當於 _mktime32。
調整為 UTC 之後,_mktime32 會處理從 1970 年 1 月 1 日到 2038 年 1 月 19 日 03:14:07 之間的日期。 _mktime64 會處理從 1970 年 1 月 1 日到 3000 年 12 月 31 日 23:59:59 之間的日期。 即使您指定的日期是在範圍之內,此調整也可能會使這些函式傳回 -1 (轉換類型為 time_t、__time32_t 或 __time64_t)。 例如,您在開羅 (埃及),此地區比 UTC 快兩小時,因此會先將 timeptr 中您指定的日期減去兩小時;而這麼做可能會使您的日期落在範圍之外。
可能會使用這些函式進行驗證及填寫 tm 結構。 若成功,這些函式會將 tm_wday 和 tm_yday 的值設定為適當的值,並設定其他元件,以表示指定的月曆時間,但同時也會強迫這些值在正確範圍內。 除非已經確認 tm_mon 和 tm_year,否則不會設定 tm_mday 的最終值。 當指定 tm 結構時間時,請將 tm_isdst 欄位設定為:
零 (0),以指出標準時間已生效。
大於 0 的值,以指出日光節約時間已生效。
小於 0 的值,使 C 執行階段程式庫程式碼計算標準時間或日光節約時間是否生效。
C 執行階段程式庫會從 TZ 環境變數判斷日光節約時間行為。 若無設定 TZ,會使用 Win32 API 呼叫 GetTimeZoneInformation (英文),從作業系統取得日光節約時間資訊。 若此作業失敗,程式庫會在實作日光節約時間的計算時,假定使用美國的規則。 tm_isdst 是必要的欄位。 若無設定,該值會是未定義,而且這些函式的傳回值會無法預期。 若 timeptr 指向之前呼叫 asctime、gmtime 或 localtime (或是這些函式的變數) 所傳回的 tm 結構,則 tm_isdst 欄位包含正確的值。
請注意,gmtime 及 localtime (和 _gmtime32、_gmtime64、_localtime32 和 _localtime64) 會針對轉換,為每個執行緒使用單一緩衝區。 若您將此緩衝區提供給 mktime、_mktime32 或 _mktime64,則會終結之前的內容。
這些函式會驗證它們的參數。 若 timeptr 為 NULL 指標,則會叫用無效參數處理常式,如 參數驗證 中所述。 若允許繼續執行,函式會傳回 -1,並將 errno 設為 EINVAL。
需求
常式 |
必要的標頭 |
---|---|
mktime |
<time.h> |
_mktime32 |
<time.h> |
_mktime64 |
<time.h> |
如需其他相容性資訊,請參閱<簡介>中的相容性。
程式庫
所有版本的 C 執行階段程式庫。
範例
// crt_mktime.c
/* The example takes a number of days
* as input and returns the time, the current
* date, and the specified number of days.
*/
#include <time.h>
#include <stdio.h>
int main( void )
{
struct tm when;
__time64_t now, result;
int days;
char buff[80];
time( &now );
_localtime64_s( &when, &now );
asctime_s( buff, sizeof(buff), &when );
printf( "Current time is %s\n", buff );
days = 20;
when.tm_mday = when.tm_mday + days;
if( (result = mktime( &when )) != (time_t)-1 ) {
asctime_s( buff, sizeof(buff), &when );
printf( "In %d days the time will be %s\n", days, buff );
} else
perror( "mktime failed" );
}
範例輸出
Current time is Fri Apr 25 13:34:07 2003
In 20 days the time will be Thu May 15 13:34:07 2003
.NET Framework 對等用法
請參閱
參考
localtime、_localtime32、_localtime64