strftime 没有给出 struct tm 的年份

strftime not giving year of struct tm

我有这个函数可以获取输入日期的前一天:

Date dateDayBefore(char* inputDate)
{
     struct tm dayBefore = { 0 };

     char** fields = split(inputDate, 3, "/");

     dayBefore.tm_mday = atoi(fields[0]);
     dayBefore.tm_mon = atoi(fields[1]) - 1;
     dayBefore.tm_year = atoi(fields[2]) - 1900;

     dayBefore.tm_mday--;
     mktime(&dayBefore);

     char yesterday[10];
     strftime(yesterday, sizeof(yesterday), "%d/%m/%Y", &dayBefore);

     Date yesterdayDate = dateCreate(yesterday);
     yesterdayDate.year += 1900;
     return yesterdayDate;
}

假设使用的所有其他函数都是正确的(例如 split 和 dateCreate),它们被用在其他地方,一切都符合预期。

struct dayBefore 将包含年份,但 string yesterday 不会在 strftime

之后考虑它

对于: 输入日期 = 15/06/2020

预期结果:2020 年 6 月 14 日

实际结果:14/06/1900

部分调试截图:

您正在尝试将一个 10 个字符的字符串 (14/06/2020) 存储到一个 10 个字符的数组中,这没有为 NULL 留下 space。

替换

char yesterday[10];

char yesterday[11];

您处理日期的方式似乎有问题,但我现在无法解决这些问题。


你的问题包含了很多不相关的细节。您的问题可以使用以下内容进行演示:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
   char* fields[] = { "15", "06", "2020" };

   dayBefore.tm_mday = atoi(fields[0]);
   dayBefore.tm_mon = atoi(fields[1]) - 1;
   dayBefore.tm_year = atoi(fields[2]) - 1900;

   dayBefore.tm_mday--;
   mktime(&dayBefore);

   char yesterday[10];
   strftime(yesterday, sizeof(yesterday), "%d/%m/%Y", &dayBefore);
   printf("%s\n", yesterday);
}