2011-09-28 41 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 
}; 

在進程中不使用任何字符串文本(bar用於時區名稱)(以保持其有效性)?這也考慮到了閏年。如果TimeDate可以轉換回time_t,則爲獎勵。

回答

9

C標準庫(通過使用ctime在C++中可訪問的),用於精確地爲此目的(或gmtime對於UTC)提供localtime。在此之後,如果標準人員不能滿足您的需求,那麼您可以將生成的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結構,其中是天/小時/分鐘...自1970年1月1日以來。這個問題是我不想自1970年1月1日以來經過了多少小時,我想要的是現在的時間(UTC格式,DST /時區分開)。它也不提供所用的時區或時區抵消的小時數。 – SSight3

+0

@ SSight3:我想你想再次閱讀該說明。 – Nemo

+0

嗨,nemo,他修改了描述,因爲我的評論,但它仍然沒有解決我的問題,這是如何將time_t轉換爲TimeDate結構,IE如何轉換成TimeDate是臭名昭着的丟失(釋義:我該如何轉換tm到TimeDate)。另請注意時區/閏年問題。 – SSight3