2011-09-28 3 views
2

Я пытаюсь сделать легко доступную переменную TimeDate, но у меня проблемы с преобразованием. В time.h, как бы я конвертировать time_t (в секундах с 1.1.1970), в текущей локальной временной зоне (компенсируя летнее время, если это применимо), так что:time_t формат преобразования вопрос

time_t Seconds; 

Становится:

struct TimeDate 
{ 
    short YYYY; 
    unsigned char MM; 
    unsigned char DD; 

    unsigned char HH; //Non-DST, non-timezone, IE UTC (user has to add DST and TZO to get what they need) 
    unsigned char MM; 
    unsigned char S; 

    char TZ[4]; //This can be optionally a larger array, null terminated preferably 
    char TZO; //Timezone Offset from UTC   

    char DST; //Positive is DST (and amount of DST to apply), 0 is none, negative is unknown/error 
}; 

Без использования строковых литералов (строка для названия часового пояса) в процессе (чтобы сохранить его эффективность)? Это также учитывает високосные годы. Бонус, если TimeDate можно преобразовать обратно в time_t.

ответ

9

Стандартная библиотека C (доступная в C++ с использованием ctime) обеспечивает localtime для этой цели (или gmtime для UTC). Вы могли бы обучить результирующий struct tm в свою собственную структуру после этого, если есть какая-то причина, по которой стандартная не достаточна для ваших нужд.

Единственное, что не дает это сам часовой пояс, но вы можете получить, что (и смещение в ISO 8601) с помощью strftime со строками %Z и %z формата


В качестве Например, вот программа, которая демонстрирует это в действии:

#include <iostream> 
#include <cstdlib> 
#include <ctime> 

int main(void) { 
    time_t t; 
    struct tm *tim; 
    char tz[32]; 
    char ofs[32]; 

    std::system ("date"); 
    std::cout << std::endl; 

    t = std::time (0); 
    tim = std::localtime (&t); 
    std::strftime (tz, sizeof (tz), "%Z", tim); 
    std::strftime (ofs, sizeof (ofs), "%z", tim); 

    std::cout << "Year:  " << (tim->tm_year + 1900) << std::endl; 
    std::cout << "Month:  " << (tim->tm_mon + 1) << std::endl; 
    std::cout << "Day:   " << tim->tm_mday << std::endl; 
    std::cout << "Hour:  " << tim->tm_hour << std::endl; 
    std::cout << "Minute:  " << tim->tm_min << std::endl; 
    std::cout << "Second:  " << tim->tm_sec << std::endl; 
    std::cout << "Day of week: " << tim->tm_wday << std::endl; 
    std::cout << "Day of year: " << tim->tm_yday << std::endl; 
    std::cout << "DST?:  " << tim->tm_isdst << std::endl; 
    std::cout << "Timezone: " << tz << std::endl; 
    std::cout << "Offset:  " << ofs << std::endl; 

    return 0; 
} 

Когда я бегу это на мой ящик, я вижу:

Wed Sep 28 20:45:39 WST 2011 

Year:  2011 
Month:  9 
Day:   28 
Hour:  20 
Minute:  45 
Second:  39 
Day of week: 3 
Day of year: 270 
DST?:  0 
Timezone: WST 
Offset:  +0800 
+0

Привет, pax, смотря на местное время, он помещается в структуру tm, из которых дни/часы/минуты ... с 01.01.1970. Проблема с этим заключается в том, что я не хочу, сколько часов прошло с 01.01.1970 года, я хочу, каково настоящее время (в формате UTC с разделением DST/Timezone). Он также не обеспечивает использование часового пояса или количество часов, на которые смещается часовой пояс. – SSight3

+0

@ SSight3: Я думаю, вы хотите снова прочитать это описание. – Nemo

+0

Привет, nemo, он изменил описание с момента моего комментария, но он по-прежнему не затрагивает мой вопрос, каким образом я могу преобразовать time_t в структуру TimeDate, IE как я конвертирую в TimeDate, как известно, отсутствует (парафраз: как конвертировать tm в TimeDate). Также обратите внимание на вопрос о часовом поясе/високосных годах. – SSight3

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