我對localtime()有疑問。范圍是將我自己的struct tbDate 轉換為struct tm。由于簡單分配不填充以下引數:
tmp->tm_wday;
tmp->tm_yday;
tmp->tm_year;
我需要,因為我有自己的strftime()實作所以,我用自己的資料填充struct tm,我呼叫mktime()來獲取秒數,而不是呼叫localtime()來填充struct tm ,并且比我填充我的struct tm。
int tbDate_to_tm(tbDate *date,struct tm *syst)
{
time_t t;
struct tm *tmp;
syst->tm_hour=0;
syst->tm_min=0;
syst->tm_sec=0;
syst->tm_year=date->year-1900;
syst->tm_mon=date->month-1;
syst->tm_mday=date->day;
t=mktime(syst);
tmp=localtime(&t);
syst->tm_hour=tmp->tm_hour;
syst->tm_isdst=tmp->tm_isdst;
syst->tm_mday=tmp->tm_mday;
syst->tm_min=tmp->tm_min;
syst->tm_mon=tmp->tm_mon;
syst->tm_sec=tmp->tm_sec;
syst->tm_wday=tmp->tm_wday;
syst->tm_yday=tmp->tm_yday;
syst->tm_year=tmp->tm_year;
return 1;
}
問題是回傳前一天的日期,而不是正確的日期。系統是Windows,編譯器是mingw。有人可以注意到有問題嗎?例子:
date->year=2022;
date->month=11;
date->day=1;
//these settings returns a time_t t
t=1667253600;
//after I call localtime()
tmp->tm_hour=23;
tmp->tm_isdst=0;
tmp->tm_mday=31;
tmp->tm_min=0;
tmp->tm_mon=9;
tmp->tm_sec=0;
tmp->tm_wday=1;
tmp->tm_yday=303;
tmp->tm_year=122;
而不是:
tmp->tm_hour=0;
tmp->tm_isdst=0;
tmp->tm_mday=1;
tmp->tm_min=0;
tmp->tm_mon=10;
tmp->tm_sec=0;
tmp->tm_wday=2;
tmp->tm_yday=304;
tmp->tm_year=122;
uj5u.com熱心網友回復:
您已經覆寫了*systpass except的成員tm_isdst。
我建議您添加以下行之一:
syst->tm_isdst = -1;
syst->tm_isdst = 0;
syst->tm_isdst = 1;
取決于你的需要。MS手冊頁mktime說
指定
tm結構時間時,將該tm_isdst欄位設定為:
- 零 (0) 表示標準時間有效。
- 大于 0 的值表示夏令時有效。
- 小于零的值使 C 運行時庫代碼計算標準時間或夏令時是否有效。
uj5u.com熱心網友回復:
Weather Vane 解決了,我輸入了syst->tm_isdst=-1,現在它可以作業了:
int tbDate_to_tm(tbDate *date,struct tm *syst)
{
time_t t;
struct tm *tmp;
syst->tm_hour=0;
syst->tm_min=0;
syst->tm_sec=0;
syst->tm_year=date->year-1900;
syst->tm_mon=date->month-1;
syst->tm_mday=date->day;
syst->tm_isdst=-1; // added this
t=mktime(syst);
tmp=localtime(&t);
syst->tm_hour=tmp->tm_hour;
syst->tm_isdst=tmp->tm_isdst;
syst->tm_mday=tmp->tm_mday;
syst->tm_min=tmp->tm_min;
syst->tm_mon=tmp->tm_mon;
syst->tm_sec=tmp->tm_sec;
syst->tm_wday=tmp->tm_wday;
syst->tm_yday=tmp->tm_yday;
syst->tm_year=tmp->tm_year;
return 1;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/524590.html
標籤:C时间
