2017-04-07 10 views
1

目的は、実際の時間でint(またはlong)を返す関数です。 私はそのためにlocaltimeを文字列に書き、これをatoi/atolとint/longに変換しようとします。しかし、どういうわけか私は期待される結果を得られない。私が試した文字列をstrftimeからint/longに変換する

もの:

  • 私は長い間に、最初のint型から切り替えます。
  • 私の文字列のサイズを変更しました。必要な15バイトの代わりに7にリサイズすると、少なくとも文字列の日付部分が変換されます。しかし、私はそれがすべて必要です。

    long generate_time() 
    {  
        time_t time1; 
        time(&time1); 
    
        char time_str[15]; 
        long act_time; 
    
        strftime(time_str, 15, "%Y%m%d%H%M%S", localtime(&time1)); 
        printf("Actual time: %s\n", time_str); 
    
        act_time = atol(time_str); 
        printf("Transformed time: %d\n", act_time); 
    
        return act_time; 
    } 
    

    応答をもたらす:

    実際の時間:20170407091221 変身時間:私はこれを願っています1240669205

私は、次のコードを持っています整理するのは簡単ですし、事前にお手伝いいただきありがとうございます!

+0

が必要なものを行うためにunit64_tを使用することができます。あなたが書いたことを理解すれば、ユーザーはあなたをより良く助けることができます... – LPs

+0

タイムスタンプ形式で時間を戻したいですか?整数値として20170407091221を返すことは意味をなさない。 –

+0

それを指摘していただきありがとうございます。私はそれを変更しました。 – Mathias

答えて

1

atolは、文字列をlongに変換します。これはおそらく32ビットなので、値20170407091221を保持できません。あなたの値1240669205は、20170407091221の下位32ビットです。

あなたは簡単にWindows上の例calc.exeためであることを確認することができます。
20170407091221進として:1258 49F3 1C15
1240669205進とおりの最大値:あなたはこのようなデータを格納するために長いを使用することはできません49F3 1C15

+0

それは私が恐れていたものです。制限を変更する方法はありますか? – Mathias

+0

@MathiasWoellmが64ビット用にコンパイルすると、Mac OS上で動作します。または、 'long long'と[strtoll()](https://linux.die.net/man/3/strtoll)を使用して、 – JeremyP

3

signed longは次のとおりです。

-2^31+1 to +2^31-1 

または

-2,147,483,648 to 2,147,483,647 

あなたは、あなたの質問を投稿する前に、英語にあなたのコードを変換する必要があります

#include <stdint.h> 

[...] 

uint64_t act_time = strtoll(time_str, NULL, 10); 
関連する問題