2016-11-15 2 views
1

私は日付と時刻を浮動小数点数にしました。日付をISO8601からchar配列に変換する

float thedate = 20161115; 
float thetime = 181011.377500; 

私はISO8601日時形式に変換したい、つまり、としてファイルに書き込み、「2016-11-15T18:10:11.377500」

私は、これらの値を得ることができました

char datetimestr[64]; 
snprintf(datetimestr, sizeof(datetimestr), "%8.0f%f", thedate, thetime); 
printf(datetimestr); 

そして、これが出力します:私は、このようなstrftimeやとしてその機能を読んで「20161115181011.377500」

を次の手順を実行して、char配列の内部はこれらの数値を解析して適切に出力することができますが、そのためには特定のアーチ固有のヘッダーが必要ですか?

私は必要なものを達成するための推奨方法は何ですか?理想的にはどこでも走る方法で。

ご意見やご要望があれば、よろしくお願いいたします。

+2

いいえ、 'strftime'は、標準Cライブラリの一部です。マニュアルページとマニュアルを読んでみてください。あなたはCライブラリのドキュメントをどこにでも見つけることができます。 –

+1

これらの数字は、常にこの形式であることが保証されていますか? 2016年8月6日は20160806ですか?もしそうなら、それは整数の数学とprintf()です。 – tinman

+0

@tinmanはい、これらは常にこの形式であることが保証されています。 – dangom

答えて

1

コードは、値を印刷して、可能性それらを再度解析

int main() { 
    long thedate = 20161115; 
    float thetime = 181011.377500f; 
    char buf[80]; 
    snprintf(buf, sizeof buf, "%+08ld%+08f", thedate, thetime); 
    int y,M,d,h,m; 
    float s; 
    int n = 0; 
    sscanf(buf, "%5d%2d%2d%3d%2d%f%n", &y, &M, &d, &h, &m, &s, &n); 
    if (n) { 
    // ISO 8601 specifies a sign must exist for distant years. 
    printf((y >= 0 && y <= 9999) ? "%4d" : "%+4d" , y); 
    printf("-%02d-%02dT%02d:%02d:%02.6f\n", M, d, h, m, s); 
    } 
    puts(buf); 
    return 0; 
} 

出力

2016-11-15T18:10:11.375000 
3

次の例のように、彼らの個々のコンポーネントを抽出するために、入力値にいくつかの数学を使用する必要があります。

int theyear = thedate/10000; 
int themonth = (thedate - (theyear * 10000))/100; 
...and so on 

次にあなたがsprintf()を使用して文字列を構築することができます。

+0

答えに感謝、私はすぐにそれを試してみます – dangom

1

幸運です。十分な精度はありません。

float20161115.0を表すことができず、20161116.0fとして保存されます。

他のタイプを検討してください。 long thedateを提案してください。

タイプ本当にthedate

に保存されているかを確認するには、以下の
volatile float f = 20161115.0f; 
printf("%.10e\n", f); 

容疑出力は2.0161116000e+07

+0

私は気づいていなかった。ご意見ありがとうございます。私はそれを「long」に変更しました。 – dangom

0

あなたのコメントと回答ありがとうございなります。私は提案に従ったのだが、かなり細かい動作するように思える(ミリ秒を除いて、それは修正が容易であるべき)

は、ここでは、コードです:

long thedate = 20161115; 
float thetime = 181011.377500; 

int y = thedate/10000; 
int m = (thedate - (y * 10000))/100; 
int d = (thedate - (y * 10000) - (m * 100)); 

int h = thetime/10000; 
int min = (thetime - (h * 10000))/100; 
int sec = (thetime - (h * 10000) - (min * 100))/1; 
float mili = thetime - ((float)h * 10000) - ((float)min * 100) - (float)sec; 

printf("%i-%i-%iT%i:%i:%i%.6f\n",y,m,d,h,min,sec,mili); 
// Outputs : 2016-11-15T18:10:110.3775000 
+0

「%i」で印刷すると、ISO 8601で指定された桁数で印刷されません。 ''%2i'を使います。 ''%02i'のように10より小さい値を適切に出力するために '0'を使います。確かに '110.3775000'秒で印刷が間違っています。ミリ秒前の値0の先頭にある。 '/ 100'と' float'で 'int'にさまざまな切り捨てがあります。 – chux

関連する問題