2011-09-28 5 views
2

쉽게 액세스 할 수있는 TimeDate 변수를 만들려고하지만 변환에 문제가 있습니다. time.h에서, 어떻게 현재 로컬 시간대로 time_t (1970 년 1 월 1 일 이후 초), 변환 것, (일광 절약 시간 (해당되는 경우)에 대한 보상)하도록 :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 표준 라이브러리 (ctime을 사용하여 C++에서 액세스 가능)는 해당 용도로 정확히 localtime (또는 gmtime : UTC)을 제공합니다. 당신은 표준 후자가 당신의 필요에 충분하지 않은 몇 가지 이유가 있다면 결과물 struct tm을 자신의 구조에 구두 수 있습니다.

는 제공하지 않는 한 가지 시간대 자체하지만 당신은 그것을 얻을 수있다 (그리고는 ISO 8601 형식의 오프셋 (offset))를 %Z%z 형식 문자열로서


strftime를 사용하여 내 상자에서이 프로그램을 실행할 때

#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

안녕하세요. 현지 시간을 살펴보면, 1960 년 1 월 1 일 이후로 일/시간/분입니다. 이 문제는 내가 1951 년 1 월 1 일 이후로 얼마나 많은 시간이 경과했는지를 원하지 않는다는 것입니다. 현재 시간을 (DST/Timezone으로 UTC 형식으로 구분하여) 원하는 것입니다. 또한 사용 된 시간대 또는 시간대가 상쇄되는 시간도 제공하지 않습니다. – SSight3

+0

@ SSight3 : 그 설명을 다시 읽고 싶습니다. – Nemo

+0

안녕하세요, nemo, 그는 내 설명부터 설명을 수정했지만 여전히 TimeDate 구조로 time_t로 변환하는 방법은 내 질문을 해결하지 못합니다. IE TimeDate로 변환하는 방법은 악명 높게 누락되었습니다. (의역 : 어떻게 변환합니까 TimeDate로 tm). 또한 시간대/윤년 문제에 유의하십시오. – SSight3