在C ++中,我正在编写一个函数,将时间(NULL)(自UTC时间1970年1月1日以来的所有秒数)转换为军事时间格式的本地时间EST(小时:分钟:秒)。老实说,我很难在数学上做到这一点,以便随着时间的推移,程序保持准确。
另外我很清楚有一个本地时间功能,但我想从头开始构建这个功能。有没有人有任何建议或提示?
答案 0 :(得分:3)
另外我很清楚有一个本地时间功能,但我想从头开始构建这个功能。有没有人有任何建议或提示?
当有大量免费且经过良好测试的套餐时,您为什么要这样做?正如评论中所提到的,将夏令时更正确是非常重要的。现有的软件包可以做到这一点,并且它们是基于IANA tzinfo数据库做的。
C选项:
std::localtime()
。该函数使用全局变量;它不是线程安全的。
localtime_r()
。这是一个POSIX函数,不是C ++库的一部分。它在Windows上不存在。
localtime_s()
。这是一个可选的C11功能。即使它存在于您的计算机上,它也可能不属于<ctime>
。
C ++选项:
Howard Hinant的日期时间模块https://github.com/HowardHinnant/date。
答案 1 :(得分:2)
localtime()
应该完成计算日期的工作;否则使用gmtime()
。根据值构建字符串是一项单独的工作,请参阅strftime()
。
答案 2 :(得分:1)
如果您想了解将天数转换为年/月/日三(和返回)的算法,请在此处进行高度优化,并详细解读(不要阅读)在操作重型机械时):
http://howardhinnant.github.io/date_algorithms.html
您还应该知道time()
的大多数(全部?)实现跟踪称为Unix Time的UTC的近似值。此计数将闰秒视为对不完美时钟的时钟校正。这意味着您可以忽略将Unix Time秒转换为天数时的闰秒效果(仅除以86400)。
为了转换为EST,你有一些选择(按照增加难度和准确度的顺序):
您可以忽略夏令时,并始终将偏移量设为-5小时。
您可以采用当前的夏令时规则,忽略它们过去曾多次更改的事实,并且可能会再次发生变化。
您可以从IANA timezone database获取过去和现在的规则, 或您的操作系统的本地同等产品。
答案 3 :(得分:0)
您需要考虑两件事:
<强> 1。闰年
一年中多一天,可以用数学方法计算。
<强> 2。闰秒
根据需要插入或移除秒数(因此一分钟可以有61或59秒)。
这些是不规则的,你需要一个查找表。否则您的转换例程将不正确。