2011-09-28 25 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形式でオフセット)%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日以降の日/時間/分です。この問題は、1970年1月1日から何時間が経過したかを望んでいないということです。現時点を(DST /タイムゾーンを別にしたUTC形式で)欲しいです。また、使用されるタイムゾーンや、タイムゾーンがオフセットされる時間も指定しません。 – SSight3

+0

@ SSight3:あなたはその説明をもう一度読んでみたいと思います。 – Nemo

+0

こんにちはnemo、彼は私のコメント以来の記述を変更しましたが、私はTimeDate構造にtime_tをどのように変換するのですか私の質問にはまだ対処していません。私はTimeDateに変換する方法を悪名高く言います(言い換えれば: TimeDateにtm)。また、タイムゾーン/閏年の問題に注意してください。 – SSight3