アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。
現在時刻を取得し、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を結合してひとつの変数に格納することは可能でしょうか??

A 回答 (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秒単位になります。
    • good
    • 1

>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);
    • good
    • 0

>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
    • good
    • 0

> 現在時刻を取得し、yyyymmddhhmmss形式でひとつの変数に持たせたい



というのが「文字列を取得したい」という意味であれば、strftime()で可能です。
フォーマットは "%Y%m%d%H%M%S" を指定すればよいでしょう。
    • good
    • 0

OSとコンパイラは何でしょうか。


また、1つの変数の型はなんでもよいのですか?
なんでもよければ、
struct tm *dateのところを
更に
struct tm date_save;を定義して
date_save = *date;
とすれば、date_saveにそのまま格納されます。
    • good
    • 0

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

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!