2017-03-11 4 views
1

Ich las die folgenden: http://en.cppreference.com/w/cpp/chrono/c/mktimeEpoche in C++ mit mktime

, die insbesondere sagt:

Konvertiert lokale Kalenderzeit zu einer Zeit, da Epoche als time_t Objekt.

hat nahm ich an diese Epoche die Epoche Unix ist (1970 01 01), aber aus dem folgenden Programm

#include <ctime> 
#include <iostream> 

int main() 
{ 
    std::tm example = {00, 00, 00, 01, 12, 69}; 
    std::cout << std::mktime(&example) << std::endl; 
    return 0; 
} 

Ich habe die Ausgabe

Das sagt mir, dass die Epoche am 1. Dezember 1969 um 00:00:00 ist. Ist die Epoche Implementierung definiert ed, oder habe ich ein anderes grundlegendes Missverständnis?

+0

Die 'epoch' wird nicht durch die' 'C++ Standard. 'POSIX' definiert es als' 1970 01 01', also passen 'unix/linux' Maschinen dazu. – Galik

+0

Ich lief dies auf einer Unix-Box – user1207217

Antwort

2

See here.

tm_mon als Monat seit Januar [0,11] definiert, die zu std::tm bis Dezember Ihrer 12 Monate gegeben machen + 1 Monat, so Januar 1970

Als Beispiel das Jahr 1968 mit 24 Monaten 0 zurück, auch:

#include <ctime> 
#include <iostream> 

int main(){ 
    std::tm example; 
    example.tm_sec = 0; 
    example.tm_min = 0; 
    example.tm_hour = 0; 
    example.tm_year = 68; 
    example.tm_mon = 24; 
    example.tm_mday = 1; 

    std::cout << std::mktime(&example) << "\n"; 
    return 0; 
} 

Ausgang:

0 

(oder -3600 wegen DST)

+1

Hab es - Ich habe meine tm falsch initialisiert :) – user1207217

2

Für eine moderne, weniger fehleranfällig Art und Weise, dies zu tun, ist hier ein free, open-source C++11/14/17 library die gleiche Sache zu tun, den fehleranfällig, faden unsicheren C-API zu vermeiden.

#include "chrono_io.h" 
#include "date.h" 
#include <iostream> 

int 
main() 
{ 
    using namespace date; 
    sys_seconds t = sys_days{1_d/dec/1969}; 
    std::cout << t.time_since_epoch() << '\n'; 
} 

Ausgang:

-2678400s