2012-01-10 39 views
1

在使用MS VC++ 2008運行應用程序時,我在C中實現Ctime()時遇到了一個問題。C到Mysql的數據類型兼容性

通過使用ctime我會得到當前時間格式爲Sun Jan 09 14:38:09 2011。有什麼辦法將上述格式轉換爲2012-01-09 14:38:09(在MYSQL中)。 C中是否有直接的功能?

有沒有建議這樣做?

+0

您可以將'time_t'轉換成'結構tm'與['本地時間()'](HTTP: //pubs.opengroup.org/onlinepubs/9699919799/functions/localtime.html)(或['gmtime()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/gmtime.html)),然後使用['strftime()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html)來根據需要格式化日期。 – pmg 2012-01-10 14:57:53

+0

感謝pmg.ur想法的工作..一個更多的疑問。如果我想插入當前時間在三個檔案atable.But三個時間應略有不同。是否有可能做? NOW我可以所有三個文件包含相同的時間.eg:12:05,12:08,12:10..like ...這樣? – user1140755 2012-01-11 07:09:20

+0

獲取3個不同的'time_t'值。將它們轉換爲'struct tm'並根據需要格式化每一個。例如:'time_t t0 = time(0); time_t t1 = t0 + 3600; time_t t2 = t0 + 24 * 3600;' – pmg 2012-01-11 09:01:48

回答

0

你可以把你time_tlocaltime()(或gmtime())一struct tm,然後使用strftime()如要格式化的日期。

例子:

char out[20]; 
time_t t0 = time(0); 
struct tm *tm0 = localtime(t0); 
strftime(out, sizeof out, "%Y-%m-%d %H:%M:%S", tm0); 

如果您需要爲不同的數據庫列不同time_t值,創建它們。
然後轉換爲struct tm並按上述格式對每一個進行格式化。
例子:

time_t t0 = time(0);  /* now */ 
time_t t1 = t0 + 3600;  /* 1 hour from now */ 
time_t t2 = t0 + 24*3600; /* 1 day (24 hours) from now */ 

從發表的評論,使OP接受的答案

0

根據man ctime()

的asctime()和mktime()函數都採用參數 表示其表示分離成 年,月,日破斷時間等

我想你可以使用這些其他功能來做你想做的。

0

C中沒有一個使用mktime(或mktime_r)和sprintf創建自己的時間格式。

+0

使sprintf(),而不是printf() – 2012-01-10 14:01:28

+0

@Pete:但當然。 – 2012-01-10 21:31:21

0

在我看來,處理這種(或任何其他)不匹配的唯一方法是將time()返回的原始值存儲在表中;然後讓任何應用程序(包括你的)將這些值格式化爲任何想要顯示用戶的安排。

這種方法提供了三大勝:

  1. 它採用通用的,簡單,證據充分的time_t的格式的優勢,這意味着你可以給DB路程,確保任何人都可以解釋和處理它沒有進一步的工作/文件給你。 struct tm和類似ctime的格式完全是任意的,由30年前的一些可憐的午夜程序員選擇。

  2. 您避免了任何人想要在過去是您的代碼中實施國際化的任何人當之無愧的蔑視和憤怒。

  3. 最重要的是:它將時間存儲爲您或其他人可以排序/選擇的格式,而其他格式不適用。

這是基礎性的,我相信,你的桌子被廣泛理解,你可以做到這一點。您可以通過存儲raw,time_t值來實現此目標。