簡體   English   中英

為時間格式struct“tm”添加延遲

[英]add delay to time format struct “tm”

我想在格式struct“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 !!

任何推向正確的方向都會非常有幫助

你的struct tm * ts_delay會被2.對localtime()調用覆蓋你有這樣的代碼:

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

現在, localtime()返回一個指針。 因此必須分配一些存儲,以便localtime的返回值可以指向somwhere有效。 運行時將在單個靜態緩沖區(可能是每個線程)中將該存儲分配給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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM