【问题标题】:add delay to time format struct "tm"为时间格式结构“tm”添加延迟
【发布时间】:2013-12-06 10:27:53
【问题描述】:

我想在格式结构“tm”中添加第二次延迟,所以我运行以下代码:

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

#define SEC_PER_DAY 86400

#define SEC_PER_HR 3600

#define SEC_PER_MIN 60

int main(void) {
    time_t     now;
    time_t     time_delay;
    struct tm *ts;
    struct tm *ts_delay;
    char       buf[140];
    char       buf_delay[140];
    now = time(NULL);
    int delay =100;

    ts_delay = localtime(&now);

    printf("day = %d \n",ts_delay->tm_mday);
    ts_delay->tm_mday += delay /SEC_PER_DAY;
    printf("day = %d \n",ts_delay->tm_mday);
    printf("hour = %d \n",ts_delay->tm_hour);
    ts_delay->tm_hour += (delay%SEC_PER_DAY)/SEC_PER_HR;
    printf("hour = %d \n",ts_delay->tm_hour);
    printf("min = %d \n",ts_delay->tm_min);
    ts_delay->tm_min += ((delay%SEC_PER_DAY)%SEC_PER_HR)/SEC_PER_MIN;
    printf("min = %d \n",ts_delay->tm_min);
    printf("sec = %d \n",ts_delay->tm_sec);
    ts_delay->tm_sec += ((delay%SEC_PER_DAY)%SEC_PER_HR)%SEC_PER_MIN;
    printf("sec = %d \n",ts_delay->tm_sec);

    /* Format and print the time, "ddd yyyy-mm-dd hh:mm:ss zzz" */
    ts = localtime(&now);


    strftime(buf, sizeof(buf), "%FT%T%z", ts);
    strftime(buf_delay, sizeof(buf_delay), "%FT%T%z", ts_delay);
    puts(buf);
    puts(buf_delay);
    return 0; 
}

结果:

day = 6
day = 6
hour = 4
hour = 4
min = 14
min = 15
sec = 24
sec = 64
2013-12-06T04:14:24-0600 ==> ts
2013-12-06T04:14:24-0600 ==> ts_delay

ts_delay 好像没有加延迟!!

任何朝着正确方向的推动都会非常有帮助 thx

【问题讨论】:

  • 感觉直接将delay添加到now会更直接,但要摆弄秒/天等。

标签: c time strftime


【解决方案1】:

您的 struct tm * ts_delay 被 2. 调用 localtime() 覆盖 你有这个代码:

ts_delay = localtime(&now);
... change ts_delay;
ts = localtime(&now);

现在,localtime() 返回一个指针。因此必须分配一些存储空间,以便本地时间的返回值可以指向有效的地方。 运行时将在单个静态缓冲区(可能每个线程)中为结果分配该存储 本地时间()。所以2.调用localtime()会覆盖ts_delay指向的同一个缓冲区。

而是将 localtime() 的结果复制到您自己管理的存储中,而不是使用 struct tm 指针指向单个可用缓冲区。

struct tm ts;      //not a pointer anymore
struct tm ts_delay;

ts_delay = *localtime(&now); //copy the returned struct
... change ts_delay;
ts = *localtime(&now);

或者如果你的平台提供getlocaltime_r,例如

localtime_r(&now, &ts);

【讨论】:

    猜你喜欢
    • 2011-05-11
    • 2017-10-29
    • 1970-01-01
    • 2021-08-17
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多