Какъв е правилният начин за преобразуване в UNIX timestamp от датата и часа в C/C++?

Имам много дати с време в този формат:

day.mon.year - hour:min:sec

И трябва да конвертирам тези дати с време в Unix timestamp.

Използвах tm структура, но не мога да попълня тези полета:

tm_wday
tm_yday

И не трябва да попълвам тези полета, защото не знам дали това поле има някакъв ефект върху стойността на Unix timestamp.

Помогнете ми да избера правилния начин за изчисляване на времевия печат на Unix.

P.S. Датите с време не са текущи, те могат да бъдат дата от 20-ти век или бъдещи дати (до 2038 година).

P.P.S. Използвам OS Windows.


person define_rak    schedule 12.07.2013    source източник
comment
WTF. Близки хора, моля, GTFO и се върнете към тролването на Wikipedia за изтриване! Това е напълно основателен въпрос. Бележка към модовете: можем ли да получим функция, чрез която потребителите, които редовно злоупотребяват с функцията за гласуване за затваряне, получават привилегиите си за гласуване за затваряне суспендирани или окончателно отменени?   -  person R.. GitHub STOP HELPING ICE    schedule 12.07.2013


Отговори (2)


POSIX има формула за точно това, което искате:

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_15

tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 +
    (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 -
    ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400

Това работи винаги, когато имате разбито време в GMT, дори ако базовите системни функции mktime и т.н. не използват същия формат time_t като "Unix timestamps".

Ако първоначалното ви време е в местно време, можете да използвате mktime и gmtime, за да го конвертирате в GMT, като използвате представата на системата за правилата за часовата зона. Ако искате да приложите свои собствени правила за отместване на часовата зона, просто направете това ръчно, преди да използвате горната формула.

person R.. GitHub STOP HELPING ICE    schedule 12.07.2013
comment
Така че не е ли необходима променливата за лятно часово време за изчисляване на Unix времето? - person define_rak; 12.07.2013
comment
Както казах, формулата изисква въвеждане в GMT. DST е част от преобразуването на местното време в GMT. - person R.. GitHub STOP HELPING ICE; 12.07.2013
comment
Как да се справя с времето преди октомври 1582 г.? - person Aaron Franke; 25.05.2021
comment
@Aaron: Това е напълно различен въпрос (задайте го като нов, ако желаете) и зависи от това в коя времева система искате да ги интерпретирате. - person R.. GitHub STOP HELPING ICE; 25.05.2021

Ако сте на unix, mktime() ще получи втората част от клеймото за време. Той игнорира полетата tm_wday и tm_yday.

person dmuir    schedule 12.07.2013
comment
Игнорирането на тези полета не зависи от Unix. Изисква се от ISO C. - person R.. GitHub STOP HELPING ICE; 12.07.2013