2016-06-29 158 views
3

我使用std :: localtime函數時遇到問題。當我將std :: time_t轉換爲本地結構tm時,它總是使用美國夏令時,而我想使用歐洲的(法國)。C++ std :: localtime夏令時規則(dst)歐洲vs美國

UTC:03/19/16 16:56在Local:03/19/16 18:56轉換。

在這個日期,通常,本地是17:56(UTC + 1)。 DST發生在法國27日。 經過多次測試,似乎使用的DST是基於美國的規則:DST發生在3月的第二個星期天。

我也改變了TZ environement變量,但它也失敗了。


`

if(putenv("TZ=CET-1CEST-2,M3.5.0/2,M10.5.0/3") != 0) { 
    std::cout << "Unable to set TZ" << std::endl; 
} else { 
    tz = getenv("TZ"); 
    if (tz) std::cout << tz << std::endl; 
    else std::cout << "TZ not defined" << std::endl; tzset(); 
} 

struct std::tm t; 
t.tm_sec = 0; 
t.tm_min = 56; 
t.tm_hour = 18; 
t.tm_mday = 19; 
t.tm_mon = 3-1; 
t.tm_year = 2016-1900; 
t.tm_isdst = -1; 
std::time_t tt = std::mktime(&t); 
std::cout << "UTC: " << std::put_time(std::gmtime(&tt), "%c %Z") << '\n'; // UTC : 03/19/16 16:56 
std::cout << "local: " << std::put_time(std::localtime(&tt), "%c %Z") << '\n'; // Local : 03/19/16 18:56 (not waited result) 

`

作爲精度,我使用bcc32c編譯器(Embarcadero的C++鐺基於計算機)。

我希望我很清楚,你可以幫助我。

在此先感謝

+0

這可能是一個環境的事情太多,你是什麼操作系統? – Neil

+0

你的環境是否有''? –

+0

我使用的操作系統是Win 7 32位。我用

回答

1

如果你有C++ 11(或更高版本)提供,其中包括<chrono>,如果你願意與<chrono>系統工作。如果你願意使用這個free, open-source timezone library。那麼這是一個很簡單的事:

#include "tz.h" 
#include <iostream> 

int 
main() 
{ 
    using namespace date; 
    using namespace std::chrono_literals; 
    auto zt = make_zoned("Europe/Paris", sys_days{2016_y/mar/19} + 18h + 56min); 
    std::cout << format("%m/%d/%y %H:%M %Z", zt.get_sys_time()) << '\n'; 
    std::cout << format("%m/%d/%y %H:%M %Z", zt) << '\n'; 
} 

輸出:

03/19/16 18:56 UTC 
03/19/16 19:56 CET 

總之,你形成一個zoned_time通過配對您選擇 (「歐洲/巴黎」)的時區,用sys_time (世界標準時間)。然後,您可以通過從中提取sys_time並格式化zoned_time本身來格式化zoned_time,該本身將使用zoned_timelocal_time

我試圖使用與您的評論一致的格式。你當然可以使用任何你想要的格式。您還可以包括您的系統支持的任何std::locale作爲format調用中的第一個參數(%c可以利用)。

如果需要,您還可以從sys_timelocal_time中提取單個字段,或執行其他日期或時間計算。這不僅僅是一個格式化庫。

如果你開始用time_t,還有的std::chrono::system_clock靜態成員函數的time_t轉換爲system_clock::time_point。然後,您可以使用time_point代替sys_days{2016_y/mar/19} + 18h + 56min在這個例子:

auto zt = make_zoned("Europe/Paris", system_clock::from_time_t(t)); 
+0

好的,謝謝。我會試試這個。其實,我有一個時間點 –

+0

@MathiasVantieghem:如果你有任何問題或困難,你可以在gitter上聊天(在github上的README鏈接)。開始一個github問題。在這裏平息我。或直接給我發電子郵件(只需搜索我的電子郵件地址,很容易找到)。 –

相關問題