Linux time_to_tm和当地时间

时间:2012-09-02 15:31:44

标签: linux linux-kernel

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_tztime_to_tm()结合使用,我们可以获得“真正的”本地时间吗? AFAIK,本地时间表示法属于userland。例如,DST是在每个时区的特殊编译配置文件中定义的。

我很困惑。内核中sys_tz的含义是什么?

2 个答案:

答案 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这样的地方也想要使用时区。