Linux内核提供time_to_tm()
(请参阅here):
/**
* time_to_tm - converts the calendar time to local broken-down time
*
* @totalsecs the number of seconds elapsed since 00:00:00 on January 1, 1970,
* Coordinated Universal Time (UTC).
* @offset offset seconds adding to totalsecs.
* @result pointer to struct tm variable to receive broken-down time
*/
void time_to_tm(time_t totalsecs, int offset, struct tm *result)
根据说明,tm
将是本地故障时间。
因此,我了解tm
将尊重我当地的时区和夏令时。
如果这是正确的,我在代码中看不到它。
也许论据offset
应该用来“提供”本地时区和夏令时?
更新
关注this question,因此将sys_tz与time_to_tm()
结合使用,我们可以获得“真正的”本地时间吗?
AFAIK,本地时间表示法属于userland。例如,DST是在每个时区的特殊编译配置文件中定义的。
我很困惑。内核中sys_tz
的含义是什么?
答案 0 :(得分:3)
内核不知道或不关心时区或DST,它所做的一切都是自纪元以来的秒数。时区和DST由用户模式下的库处理,它检查您的环境变量并可以扫描时区文件。
最终用户无法调用此函数 - 它没有系统调用接口。它只是在内核中内部使用。如果你查看交叉引用(http://lxr.free-electrons.com/ident?v=2.6.33;i=time_to_tm),它当前调用的唯一地方是FAT文件系统驱动程序。它确实用于调整时区;这样做是为了支持tzoff
挂载选项。
答案 1 :(得分:1)
用户空间可以调用settimeofday()
将本地时间和时区传递到内核。时区存储在sys_tz
中(请参阅do_sys_settimeofday()
中的kernel/time.c
)。内核主要使用sys_tz
通过gettimeofday()
等将本地时间返回给用户空间,还有一些像fs/fat
这样的地方也想要使用时区。