2009-06-17 31 views
3

Ich suchte nach einer numerischen Darstellung für ein Datum und Unix-Zeit für Mitternacht (in UTC) scheint eine vernünftige Wahl dafür zu sein. Aber, wie ich in meinen mathematischen Fähigkeiten nicht sicher bin, so istMitternacht in UTC-Zeitzone mit Unix-Zeitstempel

date = date - date % (24 * 60 * 60); 

wo date Unix-Zeitstempel ist, die Art und Weise, das zu tun? Gibt es eine einfachere Methode?

Antwort

5

Ja, Ihre Formel ist eine vollkommen gute Möglichkeit, das zu tun. Eine andere Möglichkeit, das gleiche zu erreichen, ist:

date = (date/86400) * 86400; 

Es kann sich lohnen, unter Hinweis darauf, dass die obige Formel integer (Kürzen) Division annimmt. Ich glaube auch, dass 86400 eine ausreichend häufig verwendete Konstante ist, die im Quellcode ohne zusätzlichen Kommentar erscheinen kann.

0

Verwenden Sie einfach strtotime ohne Zeitabschnitt.

+0

Funktioniert nicht in MySQL und haXe :) – vava

1

Gewünschte Sprache/Bibliotheken?

Ich nehme C mit UNIX-Standardbibliotheken an.

time.h wäre perfekt geeignet.

#include <time.h> 

struct tm date_tm; 
time_t date; 

localtime_r(NULL, &date_tm); 
date_tm.tm_sec = 0; 
date_tm.tm_min = 0; 
date_tm.tm_hour = 0; 

date = mktime(&date_tm); 

Ich nehme an, die Kreisverkehr-string/aus-String-Methode auch funktionieren würde, aber ich würde es nicht empfehlen.

#define DATE_FORMAT "%F %Z" /* yyyy-mm-dd t-z */ 

char date_str[15]; 
struct tm date_tm; 
time_t date; 

localtime_r(NULL, &date_tm); 
strftime(date_str, sizeof(date_str), DATE_FORMAT, &date_tm); 
strptime(date_str, DATE_FORMAT, &date_tm); 

date = mktime(&date_tm); 

Hmm (%F und %Z sollte von C99 und/oder einem POSIX oder SUS-Spezifikation. Erforderlich), habe ich zunächst nicht feststellen, dass Sie UTC möchten. Da ein UNIX-Tag garantiert immer 86400 UNIX-Sekunden in UNIX-Zeit beträgt, sehe ich kein Problem mit Ihrer ursprünglichen Lösung.

Verwandte Themen