我希望将昨天的日期转换为格式的字符:YYYYMMDD(没有斜点等)。
我正在使用此代码来获取今天的日期:
time_t now;
struct tm *ts;
char yearchar[80];
now = time(NULL);
ts = localtime(&now);
strftime(yearchar, sizeof(yearchar), "%Y%m%d", ts);
我如何调整此代码以便生成昨天的日期而不是今天的日期?
非常感谢。
答案 0 :(得分:8)
mktime()
函数会规范化您传递的struct tm
- 所以您需要做的就是:
now = time(NULL);
ts = localtime(&now);
ts->tm_mday--;
mktime(ts); /* Normalise ts */
strftime(yearchar, sizeof(yearchar), "%Y%m%d", ts);
答案 1 :(得分:5)
如何添加
now = now - (60 * 60 * 24)
在某些非常罕见的极端情况下(例如在闰秒期间)可能会失败但是应该在99.999999%的时间内执行您想要的操作。
答案 2 :(得分:2)
只需从time(NULL);
中减去一天的秒数即可。改变这一行:
now = time(NULL);
到此:
now = time(NULL) - (24 * 60 * 60);
答案 3 :(得分:2)
请尝试此代码
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
int main(void)
{
char yestDt[9];
time_t now = time(NULL);
now = now - (24*60*60);
struct tm *t = localtime(&now);
sprintf(yestDt,"%04d%02d%02d", t->tm_year+1900, t->tm_mday,t->tm_mon+1);
printf("Target String: \"%s\"", yestDt);
return 0;
}
答案 4 :(得分:0)
你非常接近。首先,Tyler的解决方案几乎工作 - 您需要使用(24*60*60*1000)
,因为时间(3)返回毫秒。但请看一下struct tm
。它包含日期的所有组成部分的字段。
更新:该死的,我的错误 - 时间(3)确实返回秒。我在想另一个电话。但无论如何,请查看struct tm
的内容。
答案 5 :(得分:0)
您可以在将ts
结构传递给strftime
之前对其进行操作。该月的某一天包含在tm_mday
成员中。基本程序:
/**
* If today is the 1st, subtract 1 from the month
* and set the day to the last day of the previous month
*/
if (ts->tm_mday == 1)
{
/**
* If today is Jan 1st, subtract 1 from the year and set
* the month to Dec.
*/
if (ts->tm_mon == 0)
{
ts->tm_year--;
ts->tm_mon = 11;
}
else
{
ts->tm_mon--;
}
/**
* Figure out the last day of the previous month.
*/
if (ts->tm_mon == 1)
{
/**
* If the previous month is Feb, then we need to check
* for leap year.
*/
if (ts->tm_year % 4 == 0 && ts->tm_year % 400 == 0)
ts->tm_mday = 29;
else
ts->tm_mday = 28;
}
else
{
/**
* It's either the 30th or the 31st
*/
switch(ts->tm_mon)
{
case 0: case 2: case 4: case 6: case 7: case 9: case 11:
ts->tm_mday = 31;
break;
default:
ts->tm_mday = 30;
}
}
}
else
{
ts->tm_mday--;
}
编辑:是的,本月的日期从1开始编号,而其他所有日期(秒,分钟,小时,工作日和一年中的日期)从0开始编号。
答案 6 :(得分:0)
time_t now;
int day;
struct tm *ts;
char yearchar[80];
now = time(NULL);
ts = localtime(&now);
day = ts->tm_mday;
now = now + 10 - 24 * 60 * 60;
ts = localtime(&now);
if (day == ts->tm_mday)
{
now = now - 24 * 60 * 60;
ts = localtime(&now);
}
strftime(yearchar, sizeof(yearchar), "%Y%m%d", ts);
也可以使用闰秒。