18

I need to add seconds to a date. For example, if I have a date such as 2009127000000, I need to add the seconds to this date. Another example, add 50 seconds to 20091231235957.

Is this possible in C?

2
  • I think the date format in your example is underspecified. 2009127000000 could be the 7th of December or the 27th of January. Commented Dec 7, 2009 at 10:43
  • @benjamin, have a read of the man pages for ctime (date / time conversion functions) and strptime (converts string representation of a time to a time tm structure) Commented Dec 7, 2009 at 10:53

4 Answers 4

41

In POSIX a time_t value is specified to be seconds, however that's not guaranteed by the C standard, so it might not be true on non-POSIX systems. It commonly is (in fact, I'm not sure how often it isn't a value representing seconds).

Here's an example of adding time values that doesn't assume a time_t represents seconds using the standard library facilities, which are really not particularly great for manipulating time:

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

int main()
{
    time_t now = time( NULL);

    struct tm now_tm = *localtime( &now);


    struct tm then_tm = now_tm;
    then_tm.tm_sec += 50;   // add 50 seconds to the time

    mktime( &then_tm);      // normalize it

    printf( "%s\n", asctime( &now_tm));
    printf( "%s\n", asctime( &then_tm));

    return 0;
}

Parsing your time string into an appropriate struct tm variable is left as an exercise. The strftime() function can be used to format a new one (and the POSIX strptime() function can help with the parsing).

Sign up to request clarification or add additional context in comments.

5 Comments

how do I get back a time_t from the modified then_tm?
@Lazer: mktime returns the time_t you want.
@Michael Burr. This will be true only if seconds is less then 60. I mean otherwise you have to do the entire calculation yourself
@abhi why? it works with any seconds you want: 50, 200, 3600, 86400 etc. Obviously the user will know how much time is 3600 seconds.
No guys, the seconds and minutes you have to manage yourself. Adding 120 to tm_min gives something like Current time: 19:56:21 will fire at: 19:176:21 using std::put_time(my_tm,"%X")
12

Use types and functions from <time.h>.

time_t now = time(0);
time_t now_plus_50_seconds = now + 50;
time_t now_plus_2_hours = now + 7200;

<time.h> declares functions that deal with time_t and struct tm types. These functions can do all you want.

4 Comments

Should be the answer. Clean, clear, and has excellent examples. +1
This is the universal answer other does not properly solves
This does not work if time_t is not expressed in whole seconds (not guaranteed on all platforms).
8

The C date/time type time_t is implemented as the number of seconds since a certain date, so to add seconds to it you simply use normal arithmetic. If this is not what you are asking about please make your question clearer.

2 Comments

time_t is commonly seconds, but isn't necessarily so.
Beware that this answer is not correct all the time. Please see the @MichaelBurr's answer: stackoverflow.com/a/1860996/1776916
1

Try something like this: (Note: no error checking)

include <time.h>

char* string = ...;
char  buf[80];
struct tm;
strptime(string, "%Y%m...", &tm);
tm->tm_isdst = 0;
strftime(buf, sizeof(buf), "%Y%m...", localtime(mktime(&tm) + 50));

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.