問題描述:
localtime_r()函數在一個進程生命週期中,當系統time zone改變時,localtime_r()返回的時間與系統實際時間有誤差
造成這個現象的原因:
localtime_r不會使用系統time zone設定全局變量 tzname, timezone 和daylight的值,這三個變量被用來校正格林威治(UTC) 時間爲本地時間。當系統time zone在進程週期內改變時,全局變量tzname timezone和daylight卻沒有被刷新,所以返回的時間還是以原來的timezone計算。
修改建議:
在調用localtime_r()並且系統time zone 有可能中途被修改的情況下,先調用tzset()來強制刷新時區信息.
struct tm *sc_localtime_r(cont time_t *t, struct tm *tp)
{
tzset();
return localtime_r(t, tp);
}