2009-12-07 13 views
10

Ho bisogno di aggiungere secondi ad una data. Ad esempio, se ho una data come 2009127000000, devo aggiungere i secondi a questa data. Un altro esempio, aggiungere 50 secondi al 20091231235957.aggiungere secondi ad una data

E 'possibile in C?

+0

Credo che il formato della data nel tuo esempio è underspecified. 2009127000000 potrebbe essere il 7 dicembre o il 27 gennaio. – Thomas

+0

@benjamin, ha una lettura delle pagine man per ctime (funzioni di conversione data/ora) e strptime (converte la rappresentazione della stringa di un tempo in una struttura time tm) – Glen

risposta

7

Il tipo di data/ora C time_t viene implementato come il numero di secondi da una certa data, quindi per aggiungere secondi ad esso è sufficiente utilizzare la normale aritmetica. Se questo non è quello che stai chiedendo, ti preghiamo di chiarire la tua domanda.

+16

'time_t' è in genere secondi, ma non è necessariamente così. –

7

Utilizzo tipi e funzioni da <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> dichiara funzioni che si occupano di time_t e struct tm tipi. Queste funzioni possono fare tutto ciò che vuoi.

+0

Dovrebbe essere la risposta. Pulito, chiaro e ha esempi eccellenti. +1 – MyDaftQuestions

+0

Aggiornato '' da POSIX 2016: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/time.h.html – pmg

19

In POSIX un valore di time_t è specificato in secondi, tuttavia ciò non è garantito dallo standard C, quindi potrebbe non essere vero su sistemi non POSIX. È comunemente (in effetti, non sono sicuro di quanto spesso non sia un valore che rappresenta secondi).

Ecco un esempio di aggiunta di valori di ora che non assume un time_t rappresenta secondi utilizzando le funzionalità della libreria standard, che non sono in realtà particolarmente grande per manipolare il tempo:

#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 la stringa di tempo in un adeguato La variabile struct tm viene lasciata come esercizio. La funzione strftime() può essere utilizzata per formarne una nuova (e la funzione POSIX strptime() può aiutare con l'analisi).

+1

come faccio a recuperare un 'time_t' dal' then_tm' modificato? – Lazer

+2

@Lazer: 'mktime' restituisce il' time_t' desiderato. –

+0

@ Michael Burr. Questo sarà vero solo se i secondi sono meno di 60. Voglio dire altrimenti devi fare da solo l'intero calcolo – abhi

1

provare qualcosa di simile: (Nota: nessun controllo degli errori)

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)); 
Problemi correlati