2012-01-10 20 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值来实现此目标。