回答
我要表明這樣做的方法有兩種:
- 使用C API。
- 使用基於
<chrono>
頂部的現代C++ 11/14庫。
對於本演示的目的,我假設當前時區的秒數爲1,470,003,841。我當地的時區是America/New_York,所以我得到的結果反映我們目前在-0400 UTC。
首先是C API:
這個API是不是類型安全的,而且非常容易出錯。我在編寫答案時犯了幾個錯誤,但是我能夠快速檢測到這些錯誤,因爲我正在檢查第二種技術的答案。
#include <ctime>
#include <iostream>
int
main()
{
std::time_t lt = 1470003841;
auto local_field = *std::gmtime(<);
local_field.tm_isdst = -1;
auto utc = std::mktime(&local_field);
std::cout << utc << '\n'; // 1470018241
char buf[30];
std::strftime(buf, sizeof(buf), "%F %T %Z\n", &local_field);
std::cout << buf;
auto utc_field = *std::gmtime(&utc);
std::strftime(buf, sizeof(buf), "%F %T UTC\n", &utc_field);
std::cout << buf;
}
首先我初始化time_t
。現在沒有C API從本地time_t
轉到UTC time_t
。但是,您可以使用gmtime
從UTC time_t
轉到UTC tm
(從串行到字段類型,全部採用UTC)。所以第一步是謊言到gmtime
,告訴它你有UTC time_t
。然後當你得到結果時,你只需假裝你有一個本地tm
而不是UTC tm
。目前清除?這就是:
auto local_field = *std::gmtime(<);
現在你走之前(我個人搞砸這部分了第一次通過),你必須以擴大此字段類型說,你不知道這是否是當前夏令與否。這會導致隨後的步驟去弄清楚你:
local_field.tm_isdst = -1;
接下來,您可以使用make_time
到本地tm
轉換爲UTC time_t
:
auto utc = std::mktime(&local_field);
您可以打印出來,對我來說是:
1470018241
這是4h更大。其餘的功能是以可讀的格式打印出這些時間,以便您可以調試這些東西。對於我來說,輸出:
2016-07-31 22:24:01 EDT
2016-08-01 02:24:01 UTC
現代C++ API:
存在着在的std :: lib中沒有任何設施,以做到這一點。但是,您可以使用此free, open source (MIT license) library。
#include "chrono_io.h"
#include "tz.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono_literals;
auto zt = make_zoned(current_zone(), local_seconds{1470003841s});
std::cout << zt.get_sys_time().time_since_epoch() << '\n'; // 1470018241s
std::cout << zt << '\n';
std::cout << zt.get_sys_time() << " UTC\n";
}
的第一步是從紀元創造秒爲單位的本地時間:
local_seconds{1470003841s}
接下來要做的是創建一個zoned_time
這是本當地時間配對和當前時區:
auto zt = make_zoned(current_zone(), local_seconds(1470003841s));
然後,你可以簡單地打印出的這個配對秒UTC號:
std::cout << zt.get_sys_time().time_since_epoch() << '\n';
此輸出對我來說:
1470018241s
(4H比輸入更高版本)。要打印出這個結果,我的C API中那樣:
std::cout << zt << '\n';
std::cout << zt.get_sys_time() << " UTC\n";
,輸出:
2016-07-31 22:24:01 EDT
2016-08-01 02:24:01 UTC
在這個現代化的C++的辦法,在本地時間和UTC時間是不同的類型,使其更更有可能是我在編譯時意外混合了這兩個概念(與創建運行時錯誤相反)。
您可以使用gmtime的:
轉換的time_t以TM作爲UTC時間使用由計時器指出 值填充代表相應 時間值的TM結構,表示爲UTC時間(即GMT時區的時間)。
'gmtime'假設一個基於UTC的'time_t'值。 OP說他有一個本地時間基於'time_t'值 - 我懷疑這是一個誤解。 –
- 1. 將UTC轉換爲本地
- 2. JavaScript:使用時區將UTC時間轉換爲本地時間
- 3. 如何將UTC從UTC轉換爲R的本地時間?
- 4. 將UTC時間轉換爲本地android
- 5. 本地時間轉換爲time_t(C++)
- 6. 將UTC時間轉換爲javascript中的本地時區
- 7. 如何將UTC時間轉換爲瀏覽器本地時區?
- 8. 在Xaml中將UTC日期時間轉換爲本地時區?
- 9. 如何將UTC從UTC時間轉換爲CEST時區
- 10. Objective-c:如何將PST轉換爲UTC /本地時區
- 11. Javascript:將UTC日期()對象轉換爲本地時區
- 12. 在Oracle PL/SQL中將UTC轉換爲本地時區
- 13. UTC日期轉換爲當地時區
- 14. Java - 從不同於本地的時區轉換爲UTC
- 15. 將時間戳轉換爲UTC時區
- 16. 將時間和時區轉換爲UTC
- 17. 從當地時間轉換爲UTC(由於當地時區)
- 18. 將UTC轉換爲特定時區
- 19. 將UTC轉換爲東部時區
- 20. 將UTC轉換爲不同的時區
- 21. 轉換本地時間與時區爲UTC用的ctime
- 22. 將Qt本地時區強制爲UTC
- 23. 本地到UTC UTC轉換
- 24. 將歷史時間戳從UTC轉換爲本地
- 25. 如何將UTC從本地時間轉換爲moment.js?
- 26. 將postgresql中的UTC時區轉換爲EST(當地時間)
- 27. 如何將SharePoint僅限日期字段從UTC轉換爲本地時區
- 28. 轉換UTC GMT + 0200爲本地時間
- 29. Javascript來UTC轉換爲本地時間
- 30. 將UTC轉換爲當地時間Javascript
不確定爲什麼減少?這個問題非常具體和明確。 – MATH000
應該關閉與問題相同的原因:無:-)你是對的,這個問題是從來沒有廣泛的,這裏沒有什麼錯......只是忘記了SO中的選票。 – Klaus
有效的'time_t'值(在類Unix系統上)總是相對於1970-01-01 00:00:00 ** UTC **。你是如何得到當地時間的價值的? –