2010-08-05 101 views
4

一邊做數據/時間解析在C++(以任何格式轉換的字符串爲日期),我發現下面的有用的方法日期/時間解析在C++

1)strptime() - 這裏的%d ,%m等可以有1或2個字符。該功能將照顧到這一點。由於這個原因,它會強制我們在兩個轉換說明符之間使用分隔符。例如:無法給%d%m賦予%d /%m或任何其他分隔符。這也不支持時區。

2)升壓日期IO - 這裏的%d,%米必須具有2個字符。現在,我得到的輸入字符串不保證有這個。因此,它不可能成功地使用它。但是,這似乎確實支持時區,但不確定。因爲它說的輸入它支持時區

,所以我打算結合使用這兩種來確定日期。但我想得到一個我可以考慮時區的地方。但似乎沒有人支持這一點。

沒有任何人有一個建議? RGDS, AJ

回答

3

@AJ:增加了另一種答案,使代碼被格式化

#include <stdio.h> 
#include <sys/time.h> 
#include <time.h> 

int 
main(void) 
{ 
     struct tm tm[1] = {{0}}; 

     strptime("Tue, 19 Feb 2008 20:47:53 +0530", "%a, %d %b %Y %H:%M:%S %z", tm); 
     fprintf(stdout, "off %ld\n", tm->tm_gmtoff); 
     return 0; 
} 

和運行樣子(glibc的2.10.1):

[email protected]:pts/28:~/temp> ./test 
off 19800 
+0

非常感謝! 只是好奇,這可能與glibc 2.9.x ?!你知道它是否有用嗎?無論如何, 都會嘗試,但目前無法訪問Linux機器。 – AMM 2010-08-24 04:07:31

+0

也適用於2.9。 – hroptatyr 2010-08-24 07:07:19

+0

當時區位於3個字母格式,如CST CDT等時,這是否解析? – AMM 2010-09-29 09:07:09

0

還要看libc版本的不同,我會說,當然你用'考慮'的意思:難道這就是閱讀的附加信息,然後忽略它,它是應該將解析的信息存儲在tm結構中,還是轉換爲系統/環境時間?

的glibc 2.9.1的strptime()不同時區,從信息頁面

`%z' 
     The offset from GMT in ISO 8601/RFC822 format. 

`%Z' 
     The timezone name. 

     _Note:_ Currently, this is not fully implemented. The format 
     is recognized, input is consumed but no field in TM is set. 
+0

是否有可能對我來說,轉換以下日期到格林尼治標準時間,並有這些值在tm? 星期二,2008年2月19日20時47分53秒0530 星期二,2009年4月28日18時22分39秒-0700(PDT) 如果是的話,這將是真正有用的,如果你能提供給我了,代碼在unix(只是一兩個或三個班輪) – AMM 2010-08-23 12:37:21

0

正如你注意到strptime直接支持時區。它所做的只是將格式化的無時區數據讀取到tm結構中。你必須自己解析一個可選的時區指示器(除非它的固定),然後設置TZ和使用mktime轉換成time_t。如果設置tm.is_dst爲-1,你甚至可以要求mktime嘗試自動找出DST爲您服務。

或者你可以用蒸(升壓支持一些格式,但可能沒有足夠通用)構建自己的解析器。再次像上面一樣,您可以使用mktime來組成time_t