2013-04-02 6 views
5

時間構造をFATタイムスタンプに変換しようとしています。私のコードは次のようになります:UNIXタイムスタンプからFATタイムスタンプ

unsigned long Fat(tm_struct pTime) 
{ 
    unsigned long FatTime = 0; 

    FatTime |= (pTime.seconds/2) >> 1; 
    FatTime |= (pTime.minutes) << 5; 
    FatTime |= (pTime.hours) << 11; 
    FatTime |= (pTime.days) << 16; 
    FatTime |= (pTime.months) << 21; 
    FatTime |= (pTime.years + 20) << 25; 

    return FatTime; 
} 

誰かが正しいコードを持っていますか?

+0

あなたの問題は何ですか? –

答えて

10
The DOS date/time format is a bitmask: 

       24    16     8     0 
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ 
|Y|Y|Y|Y|Y|Y|Y|M| |M|M|M|D|D|D|D|D| |h|h|h|h|h|m|m|m| |m|m|m|s|s|s|s|s| 
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ 
\___________/\________/\_________/ \________/\____________/\_________/ 
    year  month  day  hour  minute  second 

The year is stored as an offset from 1980. 
Seconds are stored in two-second increments. 
(So if the "second" value is 15, it actually represents 30 seconds.) 

私はあなたが使用しているtm_structを知らないが、それはhttp://www.cplusplus.com/reference/ctime/tm/だならば、

unsigned long FatTime = ((pTime.tm_year - 80) << 25) | 
         (pTime.tm_mon << 21) | 
         (pTime.tm_mday << 16) | 
         (pTime.tm_hour << 11) | 
         (pTime.tm_min << 5) | 
         (pTime.tm_sec >> 1); 
+0

'sizeof(int)'が2の場合に必要ないくつかの型キャスト(コードがDOS実数モード用の場合はここに当てはまります)。 –

+1

また、 'signed '型のシフトは完全に移植可能ではないので、' unsigned'型にキャストする方が良いでしょう。 –

+0

FATタイムスタンプはUTCまたはローカルタイムゾーンですか? – rustyx

1

レフテリスEはほぼ正しい答えを与えたが、ここで少しのミス

だあなたはtm_monに1を追加する必要があります、なぜならtm structは月を0から11まで(struct tm)、DOSの日付/時刻を1から12まで(FileTimeToDosDateTime)に保ちます。 は正しくありません

unsigned long FatTime = ((pTime.tm_year - 80) << 25) | 
    ((pTime.tm_mon+1) << 21) | 
    (pTime.tm_mday << 16) | 
    (pTime.tm_hour << 11) | 
    (pTime.tm_min << 5) | 
    (pTime.tm_sec >> 1); 
関連する問題