2009-12-07 7 views
10

Je dois ajouter des secondes à une date. Par exemple, si j'ai une date comme 2009127000000, je dois ajouter les secondes à cette date. Un autre exemple, ajouter 50 secondes à 20091231235957.ajouter des secondes à une date

Est-ce possible en C?

+0

Je pense que le format de la date dans votre exemple est underspecified. 2009127000000 pourrait être le 7 décembre ou le 27 janvier. – Thomas

+0

@benjamin, lisez les pages man de ctime (fonctions de conversion date/heure) et strptime (convertit la représentation sous forme de chaîne d'une structure time to time tm) – Glen

Répondre

7

Le type date/heure C time_t est implémenté comme le nombre de secondes écoulées depuis une certaine date, donc pour ajouter des secondes, vous utilisez simplement l'arithmétique normale. Si ce n'est pas ce que vous demandez, veuillez clarifier votre question.

+16

'time_t' est généralement secondes, mais ce n'est pas nécessairement le cas. –

7

Utilisez les types et les fonctions de <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> déclare fonctions qui traitent de time_t et struct tm types. Ces fonctions peuvent faire tout ce que vous voulez.

+0

Devrait être la réponse. Propre, clair, et a d'excellents exemples. +1 – MyDaftQuestions

+0

Mis à jour '' depuis POSIX 2016: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/time.h.html – pmg

19

Dans POSIX, la valeur time_t est définie sur secondes, mais ce n'est pas garanti par le standard C, donc cela peut ne pas être vrai sur les systèmes non-POSIX. Il est généralement (en fait, je ne suis pas sûr combien de fois ce n'est pas une valeur représentant des secondes).

Voici un exemple d'ajouter des valeurs de temps qui ne suppose pas time_t représente quelques secondes en utilisant les installations de la bibliothèque standard, qui ne sont vraiment pas particulièrement grand pour la manipulation du temps:

#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 votre chaîne de temps dans un montage approprié struct tm variable est laissé comme un exercice. La fonction strftime() peut être utilisée pour formater un nouveau (et la fonction POSIX strptime() peut aider avec l'analyse).

+1

Comment puis-je récupérer un 'time_t' à partir du' then_tm' modifié? – Lazer

+2

@Lazer: 'mktime' renvoie le' time_t' que vous voulez. –

+0

@Michael Burr. Cela ne sera vrai que si les secondes sont inférieures à 60. Je veux dire que sinon vous devez faire le calcul entier – abhi

1

Essayez quelque chose comme ceci: (Note: pas de contrôle d'erreur)

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)); 
Questions connexes