--- /dev/null
+/*\r
+ * “yurina”: yurina unpretentious renderer is not an anathema\r
+ *\r
+ * This software is distributed under a BSD-style license.\r
+ * See license.txt for more information.\r
+ */\r
+\r
+#pragma once\r
+\r
+#include "base/yurinaCommon.h"\r
+#include "base/YuriString.h"\r
+#include <ctime>\r
+\r
+namespace yurina\r
+{\r
+ /**\r
+ * 時刻および時間\r
+ */\r
+ class Time\r
+ {\r
+ public:\r
+ struct Counter\r
+ {\r
+ /** usec単位の基準時刻.*/\r
+ int64_t baseTime;\r
+ int64_t baseCount;\r
+ /** カウンタ周波数. 無効の場合ゼロ */\r
+ int64_t frequency;\r
+\r
+ Counter( void );\r
+ int64_t getCount( void );\r
+ void initialize( void );\r
+ };\r
+ private:\r
+ enum Flag\r
+ {\r
+ UTC = 1,\r
+ LOCAL = 2,\r
+ ABSOLUTE = 3,\r
+ RESERVED1 = 4,\r
+ RESERVED2 = 8\r
+ };\r
+ private:\r
+ /**\r
+ * 上位60bitは1970-01-01からのUTCでのusec.\r
+ * 下位4ビットはフラグ \n\r
+ * b0: UTCである場合に1 \n\r
+ * b1: 現地時刻である場合に1 \n\r
+ * b2: 予約\n\r
+ * b3: 予約\n\r
+ * @note b0とb1がともに1の場合,不正な時刻\r
+ */\r
+ int64_t time;\r
+ static Counter counter;\r
+ public:\r
+ Time( void );\r
+ Time( int64_t time, bool isUTC = false, bool isLocalTime = false );\r
+ ~Time( void );\r
+\r
+ Time operator+( const Time &delta );\r
+ Time operator-( const Time &delta );\r
+ bool operator==( const Time &other );\r
+ bool operator!=( const Time &other );\r
+\r
+ inline bool isUTC() const { return 0 != (time & UTC); }\r
+ inline bool isLocalTime() const { return 0 != (time & LOCAL); }\r
+ inline bool isTimeSpan() const { return 0 == (time & ABSOLUTE); }\r
+ inline bool isValid() const { return ABSOLUTE != (time & ABSOLUTE); }\r
+ \r
+ \r
+ inline void toUTC( void ) { time = time & (-1 ^ ABSOLUTE) | UTC; }\r
+ inline void toLocalTime( void ) { time = time & (-1 ^ ABSOLUTE) | LOCAL; }\r
+\r
+\r
+ /**\r
+ * 西暦を取得する.\r
+ * @return 西暦を表す数字\r
+ * @note 0は紀元前1年\r
+ */\r
+ int getYear( void ) const;\r
+\r
+ /**\r
+ * 月を取得する.\r
+ * @return 月を表す数字. 1月の場合1を返す\r
+ * @note 1月の場合0ではなく1\r
+ */\r
+ int getMonth( void ) const;\r
+\r
+ /**\r
+ * 日を取得する.\r
+ * @return 日を表す数字. 1日の場合1を返す\r
+ */\r
+ int getDay( void ) const;\r
+\r
+ /**\r
+ * 時を取得する.\r
+ * @return 時を表す数字. 0~23の値\r
+ */\r
+ int getHour( void ) const;\r
+\r
+ /**\r
+ * 分を取得する.\r
+ * @return 分を表す数字. 0~59の値\r
+ */\r
+ int getMinute( void ) const;\r
+\r
+ /**\r
+ * 秒を取得する.\r
+ * @return 秒を表す数字. 0~60の値\r
+ */\r
+ int getSecond( void ) const;\r
+\r
+ /**\r
+ * ミリ秒を取得する.\r
+ * @return ミリ秒を表す数字. 0~999の値\r
+ */\r
+ int getMillisecond( void ) const;\r
+\r
+ /**\r
+ * エポック時からのusec単位のカウントを取得する.\r
+ * @return カウント\r
+ */\r
+ int64_t getTicks( void ) const;\r
+\r
+\r
+ /**\r
+ * 現在のローカル時刻を返す\r
+ * @return 現在のローカル時刻\r
+ */\r
+ static Time now( void );\r
+\r
+ /**\r
+ * 現在のUTC時刻を返す\r
+ * @return 現在のUTC時刻\r
+ */\r
+ static Time nowUTC( void );\r
+\r
+ const YuriString toString( const YuriString &format ) const;\r
+ private:\r
+ static int64_t getCurrentTime( void );\r
+ void getElements( tm *elements ) const;\r
+ };\r
+}\r