вопрос формата преобразования time_t - PullRequest
2 голосов
/ 28 сентября 2011

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

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.

1 Ответ

9 голосов
/ 28 сентября 2011

Стандартная библиотека 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...