2017-11-10 2 views
0

Ich benutze einen utimbuf ändern actime bis in die Gegenwart und modtime versucht zu ändernstruct utimbuf Verwendung von Dateizugriffszeit

struct utimbuf timebuf; 
timebuf.actime = time((time_t *)0); 
timebuf.modtime = time((time_t *)0) + 2678400; 

Bei der Verwendung von time() später zu Zeit von einem Monat zu ändern, gibt es ein anderen Weg neben Sekunden hinzufügen?

+0

cur_t.actime wirft keinen Fehler? –

+0

Warum setzen Sie Ihren Titel zurück auf einen kürzeren, der nichts über Ihre Frage/Problem sagt, sondern nur den vagen Bereich, um den es geht? Es ist nicht sinnvoll, Fragen mit Titeln wie "Thing X verwenden" zu stellen, da die Frage nicht beschrieben wird und jemand, der sonst Ihr genaues Problem erkennen könnte, möglicherweise an dem uninteressanten, vagen Titel vorbeiscrollt. –

Antwort

0

Wenn Sie time() verwenden, gibt es einen anderen Weg als Sekunden hinzuzufügen?

Beim Hinzufügen/subtrahieren Sie die gleiche Einheit verwenden müssen, Sekunden hier (Sie zählen nicht nur die Anzahl der verschiedenen verschiedenen Münzen in der Tasche zu sehen, wie viel Geld Sie haben, nicht wahr ?)

Wenn zu faul, um die Anzahl der Sekunden in einer Minute, Stunde, Tag berechnen könnten Sie Code, um die bestimmten Funktionen oder Makros erstellen tun:

#define SECONDS_PER_MINUTES(m) ((m)*60) 
#define MINUTES_PER_HOURS(h) ((h)*60) 
#define HOURS_PER_DAYS(d) ((d)*24) 

Sie sogar diejenigen, die wie

wieder verwenden könnten
#define SECONDS_PER_HOURS(h) (MINUTES_PER_HOURS(h) * SECONDS_PER_MINUTES(1)) 
#define SECONDS_PER_DAYS(d) (HOURS_PER_DAYS(d) * SECONDS_PER_HOURS(1)) 

mit den Makros über Sie ein 2 Tage bis zu einer Zeit von time() wie folgt zurück hinzufügen:

time_t = time(NULL) + SECONDS_PER_DAYS(2); 

Wenn Sie die obige Zeile zum C pre-processor passieren würden, dann würden Sie, dass es sehen umgewandelt wird zu:

time_t = time(((void *)0)) + (((2)*24) * (((1)*60) * ((1)*60))); 

Diese (((2)*24) * (((1)*60) * ((1)*60)) ist eine Kompilierung konstante Zeit und nicht jedes Mal berechnet werden, würden Sie den Code lief würde, aber nur ein einziges Mal während der Kompilierung.

Hinweis: Die NULL ist ein Makro hier eine Dünung, nämlich:

#define NULL ((void *)0) 

Für die Anzahl der zweiten in einem Monat oder Jahr Berechnung leider ist es nicht so einfach, wie die Anzahl der Tage pro Monat variieren, abhängig vom Monat und für Februar auch für das Jahr, zu dem der Monat gehört.

Um dies zu umgehen, verwenden Sie zwei struct tm initialisiert auf das entsprechende Datum/Uhrzeit und übergeben Sie sie an mktime(), um die entsprechende Zeit in Sekunden (seit EPOCH) zu erhalten.

Verwenden Sie dann difftime(), um den Unterschied zu berechnen.

struct tm d1 = {0}; 
struct tm d2 = {0}; 

d1.tm_day = 1; /* day of month */ 
d1.tm_mon = 0; /* month - 1 */ 
d1.tm_year = 113 /* to specify 2013 == 1900+113 */ 

d2.tm_day = 1; /* day of month */ 
d2.tm_mon = 0; /* month - 1 */ 
d2.tm_year = 114 /* to specify 2014 == 1900+114 */ 

time_t t1 = mktime(d1); 
time_t t2 = mktime(d2); 

double d = difftime(d2, d1); /* number of seconds of year 2013. */ 
Verwandte Themen