mktime()在输入DST后立即返回错误的值



以下代码段来自busybox-1.22.1中的rtc.c

在我的例子中,utc总是0,所以这个函数只是在做从struct tmtime_t的转换。

time_t FAST_FUNC rtc_tm2time(struct tm *ptm, int utc)
{
//fprintf(stdout, "ptm->tm_hour: %dn", ptm->tm_hour);
char *oldtz = oldtz; /* for compiler */
time_t t;
if (utc) {
oldtz = getenv("TZ");
putenv((char*)"TZ=UTC0");
tzset();
}
t = mktime(ptm); //problem here
//struct tm* temp = localtime(&t);
//fprintf(stdout, "temp->tm_hour: %dn", temp->tm_hour);
if (utc) {
unsetenv("TZ");
if (oldtz)
{
putenv(oldtz - 3);
}
tzset();
}
return t;
}

此外,还有一个显示时区和夏令时信息的文件/etc/TZ

~ # cat /etc/TZ
LMT0:00LMT-1:00,M8.5.1/10,M12.5.1/10

然后,我将系统时间设置为2021/8/30,9:59:30(比夏令时开始日期早30秒),并同步到hwclock。

date -s 2021.08.30-09:59:30 >/dev/null 2>/dev/null //set system time
hwclock -w //sync RTC to system time

连续输入hwclock,同时观察CLI上的输出。

~ # hwclock
ptm->tm_hour : 9
temp->tm_hour : 9
Mon Aug 30 09:59:58 2021  0.000000 seconds
~ # hwclock
ptm->tm_hour : 10
temp->tm_hour : 11 //why not 10?
Mon Aug 30 11:00:00 2021  0.000000 seconds

为什么输入DST时mktime的返回值加1?难道它不应该受到夏令时的影响吗?

根据mktime()手册页,允许mktime()更新tm_isdst值。起始值可能导致mktime()算法以不同的方式分支:

The value specified in the tm_isdst field informs mktime() whether or not 
daylight saving time (DST) is in effect for the time supplied in the tm 
structure: a positive value means DST is in effect; zero means that DST is not in 
effect; and a negative value means that mktime() should (use timezone information 
and system databases to) attempt to determine whether DST is in effect at the 
specified time.

然后相应地更新CCD_ 12的值:

tm_isdst is set (regardless of its initial value) to a positive value or to 0, 
respectively, to indicate whether DST is or is not in effect at the specified time.

换句话说,我会在mktime()调用前后检查tm_isdst值。

我过去处理这个问题的一种方法是

  • 使用tm_isdst的已知值(例如零或一)调用mktime()
  • 对返回的time_t值调用localtime(),然后对localtime()返回的结构体tm指针检查tm_isdst
  • 如果tm_isdst已从以前的已知值更改,请更改原始结构tm以使用新的tm_isdt值,然后在信任其返回的time_t之前用它再次调用mktime()

这肯定效率较低,但可以通过预期和检查来知道DST何时发生变化。

另一种选择是在调用mktime()并信任其对时区的查找之前将tm_isdst设置为-1,并适当地设置tm_isdst

相关内容

  • 没有找到相关文章

最新更新