• 締切済み

現在時刻をyyyymmddhhmmss形式で変数に格納する

いつもお世話になっております。 現在時刻を取得し、yyyymmddhhmmss形式で ひとつの変数に持たせたいとおもっているのですが 可能でしょうか? ---------- 1 #include <stdio.h> 2 #include <time.h> 3 4 int main(void) 5 { 6 struct tm *date; 7 time_t now; 8 int year; 9 int month; 10 int day; 11 int hour, minute, second; 12 13 /* 現在の日時を取得 */ 14 time(&now); 15 date = localtime(&now); 16 17 year = date->tm_year + 1900; 18 month = date->tm_mon + 1; 19 day = date->tm_mday; 20 hour = date->tm_hour; 21 minute = date->tm_min; 22 second = date->tm_sec; 23 24 return 0; 25 26 } 27 --------------- yearからsecondを結合してひとつの変数に格納することは可能でしょうか??

みんなの回答

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.6

追記。 蛇足ですが、MS-DOSのFATファイルシステムでは、ファイルのタイムスタンプを 年:残り7ビット使用(1980年を0とする。1980~2107年のみ可) 月:1~12なので、4ビット使用 日:1~31なので、5ビット使用 時:0~23なので、5ビット使用 分:0~59なので、6ビット使用 秒:0~59を2で割り、5ビット使用 という形式で、32ビットで記録しています。 このため、ファイルのタイムスタンプは「偶数秒のみ」になっています。 あともう一つ、別の方法。 年:1980年を0とする 月:0~11(1月は0、12月は11とする) 日:0~30(1日は0、31日は30とする) 時:0~23 分:0~59 秒:0~59 として 年×32140800+月×2678400+日×86400+時×3600+分×60+秒 を計算して32ビット整数に格納すれば、1980~2113年まで使えます。 この方法なら、基準年から133年間使え、秒も1秒単位になります。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.5

>yearからsecondを結合してひとつの変数に格納することは可能でしょうか?? ・構造体変数に格納する(tm構造体を使う) ・文字列に変換する ・14桁の数値としてdouble型変数に格納する ・14桁の数値として64ビット変数に格納する ・32ビット整数にパックする ・64ビット整数にパックする など。 ●構造体変数に格納する(tm構造体を使う)方法 ANo.2参照 ●文字列に変換する方法 ANo.3参照 ●14桁の数値としてdouble型変数に格納する方法 ANo.4参照 ●14桁の数値として64ビット変数に格納する方法 ANo.4の回答のdouble型をlong long型に変えるだけ ●32ビット整数にパックする方法 年:残り6ビット使用(2000年を0とする。2000~2063年のみ可) 月:1~12なので、4ビット使用 日:1~31なので、5ビット使用 時:0~23なので、5ビット使用 分:0~59なので、6ビット使用 秒:0~59なので、6ビット使用 unsigned long packed_date_time; packed_date_time = (((date->tm_year - 100) & 0x3f) << 26) | (((date->tm_mon + 1) & 0x0f) << 22) | ((date->tm_mday & 0x1f) << 17) | ((date->tm_hour & 0x1f) << 12) | ((date->tm_min & 0x3f) << 6) | (date->tm_sec & 0x3f); ●64ビット整数にパックする方法 年:残り全ビット使用(西暦そのまま) 月:1~12なので、4ビット使用 日:1~31なので、5ビット使用 時:0~23なので、5ビット使用 分:0~59なので、6ビット使用 秒:0~59なので、6ビット使用 unsigned long long packed_date_time_L64; packed_date_time_L64 = ((unsigned long long)(date->tm_year + 1900) << 26) | (((date->tm_mon + 1) & 0x0f) << 22) | ((date->tm_mday & 0x1f) << 17) | ((date->tm_hour & 0x1f) << 12) | ((date->tm_min & 0x3f) << 6) | (date->tm_sec & 0x3f);

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

>yearからsecondを結合してひとつの変数に格納することは可能でしょうか??  こんな方法も・・。    double   dDate; // 「ひとつの変数」    (略)    dDate = (double)year * 10000000000.0;    dDate += (double)month * 100000000.0;    dDate += (double)day * 1000000.0;    dDate += (double)hour * 10000.0;    dDate += (double)minute * 100.0;    dDate += (double)second;    printf( "%14.0lf\n", dDate );  http://okwave.jp/qa4527749.html を見た後だったもので・・。 ☆なお、この変数を利用する場合、「浮動小数点数」であることにご注意下さい。    http://www.cc.kyoto-su.ac.jp/~yamada/pB/float.html

  • Ceren
  • ベストアンサー率49% (90/183)
回答No.3

> 現在時刻を取得し、yyyymmddhhmmss形式でひとつの変数に持たせたい というのが「文字列を取得したい」という意味であれば、strftime()で可能です。 フォーマットは "%Y%m%d%H%M%S" を指定すればよいでしょう。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

OSとコンパイラは何でしょうか。 また、1つの変数の型はなんでもよいのですか? なんでもよければ、 struct tm *dateのところを 更に struct tm date_save;を定義して date_save = *date; とすれば、date_saveにそのまま格納されます。

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

構造体を使うか、文字列型にすると良いと思います。