2016-01-27 80 views
2

在C++中,我正在編寫一個函數,將時間(NULL)(自1970年1月1日以UTC時間以來的所有秒數)轉換爲軍事時間的當地時間EST格式(小時:分鐘:秒)。我老實說,如何在數學上做到這一點,以便隨着時間的推移程序保持準確。將時間(NULL)轉換爲本地時間的C++函數

另外我很清楚,有一個本地時間函數,但我想從頭開始構建這個函數。有沒有人有任何建議或提示?

+0

我的不好。是時候了(NULL)。 –

+0

[This Post](http://stackoverflow.com/questions/32211045/converting-time-string-into-epoch-time-on-windows/32212867#32212867)可能會有所幫助。 – CristiFati

+2

請注意,特別是如果您瞄準本地時間,「隨着時間的推移程序保持準確」可能在您切換到夏令時或從夏令時切換時變得複雜。 –

回答

0

有你需要考慮兩件事情:

1.閏年

一個附加的一天一年,這是可能的數學上計算。

2.閏秒

秒插入或移除根據需要(這樣一分鐘可以具有61或59秒)。

那些不規則,你需要一個查找表。否則,您的轉換例程將不正確。

他們的名單可例如這裏:https://en.wikipedia.org/wiki/Leap_second

+1

我相信,在Unix中閏秒不會影響時間流:單個時間點發生兩次或被跳過。所以午夜+60 * 60 * 24秒總是午夜。只有當你需要知道_exactly_兩個時間點之間有多少秒時,才需要跳躍時間表。 –

+0

他可以使用difftime函數。 – Matt

+0

電腦時鐘不是特別準確。這就是爲什麼我們有網絡時間協議。在閏秒發生後不久,連接到互聯網的現代計算機將看到時間已經改變,並且更新其系統範圍的「自1970年1月1日00:00 UTC之後的秒數」計數器。底線:一個不需要考慮閏秒。 –

2

localtime()從glibc的應該做的計算日期的工作,所提供的環境設置爲正確的時區;否則使用gmtime()。從值中構建字符串是一項單獨的工作,請參閱strftime()

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

3

而且我很清楚,有一個本地時間的功能,但我想建立從地上爬起來這個功能。有沒有人有任何建議或提示?

爲什麼要在有大量免費且經過充分測試的軟件包時執行此操作?正如評論中提到的那樣,夏令時正確無誤是非常重要的。現有的軟件包就是這樣做的,而且他們的做法正確,基於IANA tzinfo數據庫。

C的的:

  • std::localtime()。該函數使用全局變量;它不是線程安全的。

  • localtime_r()。這是一個POSIX函數,不是C++庫的一部分。它在Windows上不存在。

  • localtime_s()。這是一個可選的C11功能。即使它存在於您的機器上,它也可能不是<ctime>的一部分。

C++選項:

+1

+1爲Howard Hinnant的日期模塊。查看[他在YouTube上的CPPCon演示文稿](https://youtu.be/tzyGjOm8AKo),描述其用法。 –

1

如果您想了解算法的天數轉換爲年/月/日三聯(和背面),在這裏,他們是高度優化的,在痛苦回吐詳細說明(唐」 T上讀同時操作重型機械):

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

你也應該知道,time()多數(所有)實現跟蹤UTC的近似值叫做Unix Time?這個計數將閏秒視爲對不完美時鐘的時鐘校正。這意味着您可以在將Unix Time秒轉換爲幾天(僅除以86400)時忽略閏秒的影響。

對於轉換爲EST,你有一些選擇(增加難度和精度的順序排列):

  1. 可以忽略夏令時,並始終以偏移量爲-5個小時。

  2. 您可以假定當前的夏令時規則,忽略了他們過去曾多次更改過的事實,並且可能會再次發生變化。

  3. 您可以從IANA timezone database, 或您的操作系統的本地等價物中獲取過去和現在的規則。

相關問題