2011-08-18 20 views
1

我想將當前時間打印爲2011-08-18 10:11:12 -07:00。我公司開發的代碼片斷如下,以指定格式獲取數字時區

#include <iostream> 

using namespace std; 

void time_to_string(time_t clock,const char *fmtstr) 
{ 
    char buf[256]; 
    if (strftime(buf, 256, fmtstr, localtime(&clock)) == 0) 
     buf[0] = 0; 
    cout << buf << endl; 
} 

int main() 
{ 
     time_to_string(time(NULL), "%Y-%m-%d %H%M%S %z"); 
} 

我能夠顯示時間爲2011-08-18 10:11:12 -0700但不是2011-08-18 10:11:12 -07:00。使用"%Y-%m-%d %H%M%S %:z"產生2011-08-18 10:11:12 %:z

如何在C/C++中完成上述任務。

回答

3

您必須手動將由%z合成的字符串拆分爲+hhmm-hhmm%z具有固定格式。看看description of strftime

替換爲UTC 8601:2000標準格式(+ hhmm或-hhmm)的偏移量,或者如果沒有可確定的時區,則由no字符替換。

用日期和時間構建一個字符串。用UTC與%z之間的偏移量構建第二個字符串,在第二個字符串中插入:。連接第一個和第二個字符串。

1

它試圖解釋%:並且它不匹配格式說明符,因此它按原樣打印出來。但你可能知道已經=)

在你的time_to_string函數中,我會手動插入':'到緩衝區中,然後再顯示它。

0

您可以在最後手動添加':',修改結果字符串。例如,

buf[26]='\0'; 
buf[25]=buf[24]; 
buf[24]=buf[23]; 
buf[23]=':'; 

我可能會忽略更好的解決方案。

+0

您不應該對緩衝區中數據的長度做任何假設。您需要先手動清零緩衝區,然後確定數據的結尾位置。 – Nathanael

+0

但是你知道buf中數據的格式... –

+0

'%z'不會改變,但問題是如果是早上7點,'%z'會被移動一個。你的代碼將會失敗。 –

1

您嘗試的語法不存在。

我所要做的是調用函數兩次:一次用"%Y-%m-%d %H%M%S ",一次用"%z",手動在第二個字符串中添加:,然後連接兩個。

要插入:,你可以做一個醜陋的緩衝操作:

buf2[5]=buf2[4]; 
buf2[4]=buf2[3]; 
buf2[3]=':'; 

strcat(buf,buf2); 

注意,佈局不太可能改變這一具體數據,所以它不是那麼難看。

0r如果你真的像矯枉過正,一個正則表達式。但是你需要一個外部庫。