2014-10-22 52 views
0

我試圖將UTC時間轉換爲自定義時區。我在這裏和那裏讀了很多關於它的問題,但他們似乎都做了相反的事情,或者在無法設置時區的地方使用時間調整器。到目前爲止,在這裏我所能夠做到的:將UTC時間轉換爲帶有提升的自定義時區

boost::local_time::time_zone_ptr   time_zone(new boost::local_time::posix_time_zone("EST5EDT,M3.2.0,M11.1.0")); 
boost::posix_time::ptime const    now(boost::gregorian::date(2004,11,5), boost::posix_time::hours(10)); 
boost::local_time::local_date_time const ny(now, time_zone); 
// 
ny.utc_time().time_of_day();  // Expected: 10:00 Actual: 10:00 
ny.local_time().time_of_day(); // Expected: 04:00 Actual: 16:00 

我想ny.local_time()來展會上04:00,因爲當UTC時間爲10:00,它在紐約的4:00。

任何人都可以提出正確的方法嗎?

+0

你真的應該避免POSIX時區。查看[時區標記wiki](http://stackoverflow.com/tags/timezone/info),其中有一個關於POSIX的部分。您應該改用IANA/Olson時區,如「America/New_York」。 Boost *有*支持這些,除了他們使用[硬編碼列表](https://github.com/boostorg/date_time/blob/master/data/date_time_zonespec.csv) - 這是過時的,並刪除所有歷史。如果你想做的對,請考慮使用[ICU](http://site.icu-project.org/)。 – 2014-10-22 17:26:13

回答

2

boost庫似乎將「偏移量」解釋爲添加到UTC以獲取本地時間的量;而標準的POSIX公約是相反的。更改爲

"EST-5EDT,M3.2.0,M11.1.0" 
    ^
+0

這很奇怪,因爲我從這個網站上得到它,它們看起來像是全錯了:http://svn.fonosfera.org/fon-ng/trunk/luci/modules/admin-fon/root/etc/timezones.db – Arthur 2014-10-22 11:16:37

+0

@jules:仔細一看,我認爲是錯誤的Boost。根據POSIX,偏移量應該是增加當地時間以獲得UTC的值; Boost相反。 – 2014-10-22 11:32:45

+0

有趣,你確定嗎?我現在正在使用提供的csv數據庫生成的posix時區字符串。它看起來像:EST-05EDT + 01,M4.1.0/02:00,M10.5.0/02:00,並且它按預期工作。 – Arthur 2014-10-22 12:18:32

相關問題