ホーム > デベロッパ > SophiaFramework > BREW C++ 逆引きコード集

BREW C++ プログラミング 逆引きコード集 : 時刻・日付・時間

C++ で作成されたBREW アプリで、時刻・日付・時間の処理を行う方法です。
SophiaFramework を用いています。

現在の日付と時刻を取得する

現在の日付と時刻を取得するには、 SFXDate::CurrentDate 関数を使用します。

SFXDate date;

date = SFXDate::CurrentDate();  // 現在の日付と時刻を取得する
      

ファイルの作成日を取得する

バージョン 4.0 以降

ファイルの作成日を取得するには、SFXFile::GetCreateDate 関数を使用します。

SFXDate date;

SFXFile::GetCreateDate(SFXPath("/data/data1.txt"), &date);

バージョン 3.0

ファイルの作成日を取得するには、SFBFileMgr::GetInfo 関数を使用します。

SFBFileMgrSmp fileMgr = SFBFileMgr::NewInstance();
FileInfo info = {0};

fileMgr->GetInfo("/data/data1.txt", &info);   // ファイルの情報を取得する

// ファイル作成日(1980 年1 月6 日00:00:00 グリニッジ標準時からの経過時間)
UInt32 fileTime = info.dwCreationDate;

SFXDate date(info.dwCreationDate);    // SFXDate 形式に変換

参照 SFXFile::GetCreateDate | SFBFileMgr::NewInstance | SFBFileMgr::GetInfo

      

コードの実行速度をミリ秒単位で計測する

SFXDate::CurrentDate 関数で取得できる時刻は秒単位です。
時間をミリ秒単位で取得するには、SFXHelper::gettimems を使用します。

UInt32 startms = SFXHelper::gettimems();

func();  // 測定したい処理

UInt32 endms = SFXHelper::gettimems();
SInt32 milisecTime = endms - startms;  // milisecTime は
                                       // 測定した時間(ミリ秒単位)

参照 SFXHelper::gettimems

      

SFXDate クラスをエクスポート、インポートする

SFXDate クラスの日時データをエクスポートし、そのエクスポートしたデータを
インポートしたい場合があります。
例えば、日時データをファイルに保存し、読み込みたい場合です。
このときは、SFXDate::AsUInt32 関数で秒に出力するのが簡単です。

// SFXDate クラスを外部にエクスポートする
SFXDate date1(2008, 10, 12, 23, 45, 58);    //     2008年10月12日 23時45分58秒

SFXAnsiString str = SFXAnsiString::Format("%u", date1.AsUInt32());
// str = "907890358"   となる

// エクスポートしたデータをインポートする
SFXDate date2(str.AsUInt32()); //date2 は 2008年10月12日 23時45分58秒 になる

参照 SFXDate::AsUInt32

      

日時の比較を行う

日時の比較には、<, >, ==, !=, <=, >= 演算子を使用するか、
SFXDate::Compare 関数を使用します。

SFXDate date1(2008, 10, 12, 23, 45, 58);    //     2008年10月12日 23時45分58秒
SFXDate date2(2009, 10, 12, 23, 45, 58);    //     2009年10月12日 23時45分58秒
SFXDate date3(2009, 10, 12, 23, 45, 58);    //     2009年10月12日 23時45分58秒
// date1 は最も過去、date2 と date3 は同じ日時

date1 < date2    // true
date2 > date3    // false
date1 == date2   // false
date1 != date2   // true
date2 <= date3   // true

SInt16 c = date1.Compare(date2);
if (c > 0) {
    // date1 が date2 より未来なら
} else if (c < 0) {
    // date1 が date2 より過去なら
} else {
    // date1 と date2 が同じなら
}

参照 SFXDate::operator< | SFXDate::operator> | SFXDate::operator== |
SFXDate::operator!= | SFXDate::operator<= | SFXDate::Compare

      

ある日時からある期間経過した後(前)の日時を求める

ある日時からある期間経過した後(前)の日時を求めるには、
SFXDate::Add* 関数、SFXDate::Sub* 関数を使用します。

加算

SFXDateDuration dateDuration(40); // 40秒
SFXDate date1(2008, 10, 12, 23, 45, 10);  // 2008年10月12日 23時45分10秒
date1.Add(dateDuration);        // +  40秒   2008年10月12日 23時45分50秒
date1.AddYear(3);               // +   3年   2011年10月12日 23時45分50秒
date1.AddMonth(25);             // +  25月   2013年11月12日 23時45分50秒
date1.AddDay(100);              // + 100日   2014年 2月20日 23時45分50秒
date1.AddHour(50);              // +  50時間 2014年 2月23日  1時45分50秒
date1.AddMinute(15);            // +  15分   2014年 2月23日  2時 0分50秒
date1.AddSecond(1000);          // +1000秒   2014年 2月23日  2時17分30秒

減算

SFXDateDuration dateDuration(40); // 40秒
SFXDate date2(2008, 10, 12, 23, 45, 10);  // 2008年10月12日 23時45分10秒
date2.Sub(dateDuration);        // -  40秒   2008年10月12日 23時44分30秒
date2.SubYear(3);               // -   3年   2005年10月12日 23時44分30秒
date2.SubMonth(25);             // -  25月   2003年 9月12日 23時44分30秒
date2.SubDay(100);              // - 100日   2003年 6月 4日 23時44分30秒
date2.SubHour(50);              // -  50時間 2003年 6月 2日 21時44分30秒
date2.SubMinute(15);            // -  15分   2003年 6月 2日 21時29分30秒
date2.SubSecond(1000);          // -1000秒   2003年 6月 2日 21時12分50秒

参照 SFXDate::Add | SFXDate::AddYear | SFXDate::AddMonth | SFXDate::AddDay |
SFXDate::AddHour | SFXDate::AddMinute | SFXDate::AddSecond |
SFXDate::Sub | SFXDate::SubYear | SFXDate::SubMonth | SFXDate::SubDay |
SFXDate::SubHour | SFXDate::SubMinute | SFXDate::SubSecond

      

2つの日時の期間(差)を求める

2つの日時の期間(差)を求めるには、- 演算子を使用します。
返り値は SFXDateDuration 型となります。

SFXDate date1(2005, 12, 15, 13, 20, 30);    //     2005年12月15日 13時20分30秒
SFXDate date2(2008, 10, 12, 23, 45, 58);    //     2008年10月12日 23時45分58秒

SFXDateDuration dateDuration(date2 - date1);

SInt64 n1 = dateDuration.AsSInt64();             // n1 = 89202328 (単位は秒)
SInt64 n2 = (date1 - date2).AsSInt64();          // n2 = -89202328

SFXDate::DurationTo 関数でも同じ結果が得られます。

参照 SFXDate::operator- | SFXDateDuration::AsSInt64 | SFXDate::DurationTo

      

日時を書式出力する

日時を書式出力するには SFXDate::Format 関数を使用します。

SFXDate date(2008, 10, 12, 23, 45, 58);    //     2008年10月12日 23時45分58秒

SFXAnsiString str = date.Format("YYYY/MM/DD hh:mm:ss Wek");
// str = "2008/10/12 23:45:58 Sun" となる

参照 SFXDate::Format

      

日付クラスから値を取得する

日付クラスから値を取得するには SFXDate::Get* 関数を使用します。

SFXDate date1(2008, 10, 12,    //     2008年10月12日 23時45分58秒
              23, 45, 58);
UInt16 year   = date1.GetYear();                //年 year = 2008
UInt16 month  = date1.GetMonth();               //月 month = 10
UInt16 day    = date1.GetDay();                 //日 day = 12
UInt16 hour   = date1.GetHour();                //時 hour = 23
UInt16 minute = date1.GetMinute();              //分 minute = 45
UInt16 second = date1.GetSecond();              //秒 second = 58
DayOfWeekEnum dayOfWeek = date1.GetDayOfWeek(); //曜日 dayOfWeek 
                                                     = DAYOFWEEK_SUNDAY
UInt32 time   = date1.AsUInt32();  //1980年1月6日 0時0分0秒 から経過した秒数
                                   //time = 907890358

曜日については「ある日付の曜日を取得する」を参照してください。

参照 SFXDate::GetYear | SFXDate::GetMonth | SFXDate::GetDay |
SFXDate::GetHour | SFXDate::GetMinute | SFXDate::GetSecond |
SFXDate::GetDayOfWeek

      

日付クラスに日時をセットする

日付クラスに日時をセットするには、以下の方法があります。

1. コンストラクタ

SFXDate date1;                             // 空の日時(不定)
SFXDate date2(2008, 10, 12, 23, 45, 58);   // 2008年10月12日 23時45分58秒
SFXDate date3(1995, 3, 15);                // 1995年3月15日 0時0分0秒

// 1980年1月6日 0時0分0秒 から経過した秒数
// ここでは32500000秒経過した 1981年1月16日 3時46分40秒 となる
SFXDate date4(32500000);

2. Set 関数

SFXDate date1, date2;

date1.Set(2008, 10, 12, 23, 45, 58);   // 2008年10月12日 23時45分58秒
date1.Set(1995, 3, 15);          // 1995年3月15日 0時0分0秒
                                 //(時、分、秒は0になることに注意)
date1.Set(32500000);             // 1981年1月16日 3時46分40秒
date2.Set(date1);                // 日付クラスを渡すことも可能

3. Set* 関数

SFXDate date1(2008, 10, 12,    //       2008年10月12日 23時45分58秒
              23, 45, 58);
date1.SetDate(1995, 1, 2);     //年月日 1995年 1月 2日 23時45分58秒
date1.SetTime(3, 4, 56);       //時分秒 1995年 1月 2日  3時 4分56秒
date1.SetYear(2030);           //年     2030年 1月 2日  3時 4分56秒
date1.SetMonth(12);            //月     2030年12月 2日  3時 4分56秒
date1.SetDay(15);              //日     2030年12月15日  3時 4分56秒
date1.SetHour(13);             //時     2030年12月15日 13時 4分56秒
date1.SetMinute(25);           //分     2030年12月15日 13時25分56秒
date1.SetSecond(1);            //秒     2030年12月15日 13時25分 1秒

参照 SFXDate::Set | SFXDate::SetDate | SFXDate::SetTime | SFXDate::SetYear |
SFXDate::SetMonth | SFXDate::SetDay | SFXDate::SetHour |
SFXDate::SetMinute | SFXDate::SetSecond

      

ある年がうるう年かを判定

ある年がうるう年かを判定するには、SFXDate クラスを使い、
3月1日の前の日が何日になっているかを調べることで行います。

以下のコードでは、2010年がうるう年かどうかを判定しています。

SFXDate date(2010, 3, 1); // 2010年の3月1日

date.SubDay(1);  // 1日戻る(2月の最終日)

if (date.GetDay() == 29) {
    // うるう年である
}

参照 SFXDate::GetDay | SFXDate::SubDay

      

ある月の最終日が何日であるかを取得する

ある月の最終日が何日であるかを取得するには、SFXDate クラスを使用します。

以下のコードは、2008年10月の最終日が何日であるかを取得しています。

SInt16 year = 2008, month = 10;
SFXDate date(year, month + 1, 1);  // 次の月の初めの日

date.SubDay(1);  // 一日戻すとその月の最後の日になる

SInt16 lastDay = date.GetDay();    // lastDay = 31

参照 SFXDate::GetDay | SFXDate::SubDay

      

ある日付の曜日を取得する

ある日付の曜日を取得するには、SFXDate::GetDayOfWeek 関数を使用します。

//year年month月day日の曜日を取得

SFXDate date(year, month, day);

DayOfWeekEnum youbi = date.GetDayOfWeek(); // 曜日を取得する

DayOfWeekEnum は曜日を表すenum型で、次のように定義されています。

enum DayOfWeekEnum {
    DAYOFWEEK_MONDAY = 0,
    DAYOFWEEK_TUESDAY,
    DAYOFWEEK_WEDNESDAY,
    DAYOFWEEK_THURSDAY,
    DAYOFWEEK_FRIDAY,
    DAYOFWEEK_SATURDAY,
    DAYOFWEEK_SUNDAY
};

使用例

static char* dayOfWeek[] = {
          "Mon", "Thu", "Wed", "Thr", "Fri", "Sat", "Sun"};  // 曜日文字列

SFXDate date1(2010, 1, 1);           // 2010年1月1日は金曜日

SFXAnsiString str = dayOfWeek[ date1.GetDayOfWeek() ]);      //  str = "Fri"

参照 SFXDate::GetDayOfWeek

      

現在日時を取得する

現在日時を取得するには、SFXDate::CurrentDate 関数を使用します。

SFXDate date = SFXDate::CurrentDate(); // date に現在日時が代入される

参照 SFXDate::CurrentDate