set_time()
函數應該需要一段特定時間,並將指定的分鐘數添加到此時間,並將其保存在*t
中。如何將分鐘添加到包含UTC時間的結構tm?
#include <stdio.h>
#include <time.h>
enum {JAN, FEB, MAR, APR, MAY, JUNE, JULY, AUG, SEP, OCT, NOV, DEC};
void set_time(struct tm *t,
int year, int mon, int day,
int hour, int min, int sec,
int mins_to_add)
{
/* Copy all the values. */
t->tm_year = (year - 1900);
t->tm_mon = mon;
t->tm_mday = day;
t->tm_hour = hour;
t->tm_min = min;
t->tm_sec = sec;
// No DST since we are storing UTC time.
t->tm_isdst = 0;
/* Add minutes to time. */
t->tm_min += mins_to_add;
mktime(t);
/* Debug print */
printf("%s\n", asctime(t));
}
int main(int argc, char **argv)
{
struct tm t;
set_time(&t, 2011, AUG, 1, 10, 00, 00, 0);
return 0;
}
那麼,請問set_time()
不了了之添加到8月1日10:00:00 2011年但是,如果我的Windows系統設置爲EST時區,輸出我得到的是:Mon Aug 01 11:00:00 2011
的發生錯誤,因爲我做(在上述例中爲0)將在指定的分鐘數到指定時間的任務(8月1日10:00:00 2011在上面的例子)與這部分代碼:
/* Add minutes to time. */
t->tm_min += mins_to_add;
mktime(t);
mktime()
被調用來調整所有其他memb如果t->tm_min
由於添加而超過59,則該結構的變量。但mktime()
將struct tm
對象的時間視爲當地時間。因此,當它看到2011年8月1日的日期和當地時區爲EST時,它假定需要應用DST,但它發現t->tm_isdst
設置爲0
(這意味着DST不適用於*t
中的時間)。因此,它適用DST,將日期從2011年8月1日10:00:00至2011年8月1日11:00:00調整,並將t->tm_isdst
設置爲1
。
如果我初始化t->tm_isdst
到1
,就不會發生這種問題,因爲mktime()
會發現,在*t
的時間已經有DST應用到它。然而,如果我要求set_time()
向不應用DST的日期添加任何內容(例如Jan 01 10:00:00 2011),那麼結果就會混亂。現在,它會嘗試關閉*t
中的DST,從而設置t->tm_isdst
設置爲0並重新調整日期至2011年1月1日09:00:00。
因此,如果我希望在指定時間內增加額外小時或從指定時間中減去額外小時,會產生不良影響沒有增加任何內容。發生這種情況的原因是,mktime()
發現t->tm_isdst
中的DST設置與系統本地時區不符時,它會嘗試通過重新調整*t
中的時間來正確設置它。
解決此問題的正確方法是什麼?
密切相關,可以說是一個騙局:http://stackoverflow.com/questions/530519/stdmktime-and-timezone-info。 – ruakh 2012-01-27 23:43:06
ruakh,你提到的帖子是密切相關但不相似的。這裏的問題有一個簡潔的解決方法,它包含從'mktime()'返回的時間戳中減去時區偏移量。但是,我的問題是在'struct tm'對象中添加一定數量的分鐘,並確保'mktime()'由於DST設置不會添加或減去日期以外的任何內容。 – 2012-01-27 23:52:20