2013-07-12 2 views
3

У меня есть много дат с течением времени в этом формате:Каков правильный способ преобразования в временную метку UNIX с даты и времени на C/C++?

day.mon.year - hour:min:sec 

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

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

tm_wday 
tm_yday 

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

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

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

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

+1

WTF. Близкие люди **, пожалуйста, GTFO и вернитесь к троллингу Wikipedia для удаления **! Это совершенно правильный вопрос. Замечание к модам: можем ли мы получить функцию, при которой пользователи, которые регулярно злоупотребляют функцией голосования до закрытия, получают свои права голоса на закрытие или приостановлены навсегда? –

ответ

5

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, используя системное понятие правил часового пояса. Если вы хотите применить свои собственные правила смещения часового пояса, просто сделайте это вручную, прежде чем использовать приведенную выше формулу.

+0

Так что летняя переменная времени не делает необходимо вычислить время Unix? –

+0

Как я уже сказал, формула требует ввода в GMT. DST является частью преобразования местного времени в GMT. –

0

Если вы находитесь в unix, mktime() получит вторую часть метки времени. Он игнорирует поля tm_wday и tm_yday.

+0

Я на Windows :( –

+0

@define_rak: вы, вероятно, должны упомянуть, что где-то в вопросе .... – ams

+2

Игнорирование этих полей не зависит от UNIX. Оно требуется по ISO C. –

Смежные вопросы