Как правильно преобразовать временную метку UNIX из даты и времени в C/C++?

У меня много дат со временем в таком формате:

day.mon.year - hour:min:sec

И мне нужно преобразовать эти даты со временем в временную метку Unix.

Я использовал структуру tm, но не могу заполнить эти поля:

tm_wday
tm_yday

И я не должен заполнять это поле, потому что я не знаю, влияет ли это поле на значение временной метки Unix.

Помогите мне выбрать правильный способ вычисления временной метки Unix.

P.S. Даты со временем не являются текущими, это могут быть даты 20 века или будущие даты (до 2038 года).

П.П.С. Я использую ОС Windows.


person define_rak    schedule 12.07.2013    source источник
comment
ВТФ. Узники, пожалуйста, GTFO и возвращайтесь к троллингу Википедии на предмет удаления! Это совершенно правильный вопрос. Примечание для модов: можем ли мы получить функцию, с помощью которой пользователи, которые регулярно злоупотребляют функцией голосования за закрытие, приостанавливают или отзывают свои привилегии за закрытие?   -  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

Это работает всякий раз, когда у вас есть разбивка времени по Гринвичу, даже если базовые системные функции mktime и т. д. не используют тот же формат time_t, что и «временные метки Unix».

Если ваше исходное время указано по местному времени, вы можете использовать mktime и gmtime, чтобы преобразовать его в GMT, используя системное понятие правил часового пояса. Если вы хотите применить свои собственные правила смещения часовых поясов, просто сделайте это вручную, прежде чем использовать приведенную выше формулу.

person R.. GitHub STOP HELPING ICE    schedule 12.07.2013
comment
Так что переменная летнего времени не нужна для расчета времени Unix? - person define_rak; 12.07.2013
comment
Как я уже сказал, формула требует ввода по Гринвичу. Летнее время является частью преобразования местного времени в 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