将存储为1912.02.14的日期转换为1912年2月2日的printf

时间:2019-01-06 04:00:31

标签: c

到目前为止,这两个链接很有帮助:

但是我还不能完全到达那儿。使用上面两个链接中的信息,我可以使它们的示例正常工作:

int main(int argc, char *argv[])
{
   struct tm tm;
   char str_date[256];

   strptime("01/26/12", "%m/%d/%y", &tm);
   strftime(str_date, sizeof(str_date), "%A, %d %B %Y", &tm);
   printf("%s\n", str_date);

   return 0;
}

这会在我的控制台上返回“ 2012年1月26日,星期四”,这是正确的。

到目前为止一切都很好。

但是,我尝试使用strptime格式为yyyy.mm.dd的日期的所有操作都在控制台“?,00?2019”上给了我

int main(int argc, char *argv[])
{
   struct tm tm;
   char str_date[256];

   strptime("1912.02.14", "%y.%m.%d", &tm);
   strftime(str_date, sizeof(str_date), "%A, %d %B %Y", &tm);
   printf("%s\n", str_date);

   return 0;
}

如果我可以使strptime正常工作,则可以在strftime的格式说明符中四处走动,以获取所需的输出。

答案:由于BladeMight的帮助,此代码对我来说非常有效:

#include <stdio.h>
#include <time.h>
char *strptime(const char *buf, const char *format, struct tm *tm);

int main(int argc, char *argv[])
{
   struct tm tm;
   char str_date[256];

   strptime("1912.02.14", "%Y.%m.%d", &tm);
   strftime(str_date, sizeof(str_date), "%B %d, %Y", &tm);
   printf("%s\n", str_date);

   return 0;
 }

如果我不参加:

char *strptime(const char *buf, const char *format, struct tm *tm);

然后我得到编译器错误:

78.c: In function ‘main’:
78.c:11:5: warning: implicit declaration of function ‘strptime’; did you  mean ‘strftime’? [-Wimplicit-function-declaration]
 strptime("1912.02.14", "%Y.%m.%d", &tm);
 ^~~~~~~~
 strftime

如果我添加了我在顶部发布的第二个链接的答案中提到的两个定义,那么我可以忽略strptime的定义。

我仍然遇到1位数字天的问题,无论我尝试哪种格式,最终输出中都显示前导零或前导空格。最后,我只是编写了自己的函数来解决这个问题。

我很感谢大家的帮助,因为我在这个问题上学到了很多东西。

1 个答案:

答案 0 :(得分:1)

您的Year格式有所不同,因此您应使用另一种格式,%Y而不是%y,代码:

#include <stdio.h>
#include <time.h>
char *strptime(const char *buf, const char *format, struct tm *tm);
int main(int argc, char *argv[])
{
   struct tm tm;
   char str_date[256];

   strptime("1912.02.14", "%Y.%m.%d", &tm);
   strftime(str_date, sizeof(str_date), "%A, %d %B %Y", &tm);
   printf("%s\n", str_date);

   return 0;
}

输出:

Wednesday, 14 February 1912