将时间(NULL)转换为本地时间的C ++函数

时间:2016-01-27 17:46:34

标签: c++ function time

在C ++中,我正在编写一个函数,将时间(NULL)(自UTC时间1970年1月1日以来的所有秒数)转换为军事时间格式的本地时间EST(小时:分钟:秒)。老实说,我很难在数学上做到这一点,以便随着时间的推移,程序保持准确。

另外我很清楚有一个本地时间功能,但我想从头开始构建这个功能。有没有人有任何建议或提示?

4 个答案:

答案 0 :(得分:3)

  

另外我很清楚有一个本地时间功能,但我想从头开始构建这个功能。有没有人有任何建议或提示?

当有大量免费且经过良好测试的套餐时,您为什么要这样做?正如评论中所提到的,将夏令时更正确是非常重要的。现有的软件包可以做到这一点,并且它们是基于IANA tzinfo数据库做的。

C选项:

  • std::localtime()。该函数使用全局变量;它不是线程安全的。

  • localtime_r()。这是一个POSIX函数,不是C ++库的一部分。它在Windows上不存在。

  • localtime_s()。这是一个可选的C11功能。即使它存在于您的计算机上,它也可能不属于<ctime>

C ++选项:

答案 1 :(得分:2)

如果环境设置为正确的时区,glibc的

localtime()应该完成计算日期的工作;否则使用gmtime()。根据值构建字符串是一项单独的工作,请参阅strftime()

http://linux.die.net/man/3/localtime

答案 2 :(得分:1)

如果您想了解将天数转换为年/月/日三(和返回)的算法,请在此处进行高度优化,并详细解读(不要阅读)在操作重型机械时):

http://howardhinnant.github.io/date_algorithms.html

您还应该知道time()的大多数(全部?)实现跟踪称为Unix Time的UTC的近似值。此计数将闰秒视为对不完美时钟的时钟校正。这意味着您可以忽略将Unix Time秒转换为天数时的闰秒效果(仅除以86400)。

为了转换为EST,你有一些选择(按照增加难度和准确度的顺序):

  1. 您可以忽略夏令时,并始终将偏移量设为-5小时。

  2. 您可以采用当前的夏令时规则,忽略它们过去曾多次更改的事实,并且可能会再次发生变化。

  3. 您可以从IANA timezone database获取过去和现在的规则, 或您的操作系统的本地同等产品。

答案 3 :(得分:0)

您需要考虑两件事:

<强> 1。闰年

一年中多一天,可以用数学方法计算。

<强> 2。闰秒

根据需要插入或移除秒数(因此一分钟可以有61或59秒)。

这些是不规则的,你需要一个查找表。否则您的转换例程将不正确。

例如,这里有https://en.wikipedia.org/wiki/Leap_second