/*---------------------------------------------------------------------------* Project: Horizon File: fnd_DateTime.h Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: 28097 $ *---------------------------------------------------------------------------*/ #ifndef NN_FND_DATETIME_API_H_ #define NN_FND_DATETIME_API_H_ /*! @file :include nn/fnd.h */ #include #include #include #ifdef __cplusplus namespace nn { namespace fnd { /*! @brief 曜日を表す定数です。 */ enum Week { WEEK_SUNDAY = 0, ///< 日曜日 WEEK_MONDAY, ///< 月曜日 WEEK_TUESDAY, ///< 火曜日 WEEK_WEDNESDAY, ///< 水曜日 WEEK_THURSDAY, ///< 木曜日 WEEK_FRIDAY, ///< 金曜日 WEEK_SATURDAY, ///< 土曜日 WEEK_MAX }; /*! @brief 日時を表す構造体です。 */ struct DateTimeParameters { s32 year; ///< 年 s8 month; ///< 月 s8 day; ///< 日 Week week; ///< 曜日 s8 hour; ///< 時 s8 minute; ///< 分 s8 second; ///< 秒 s16 milliSecond; ///< ミリ秒 }; /*! @brief 日時を表します。 日時は、1900-01-01 00:00:00.000 から 2189-12-31 23:59:59.999 まで扱えます。 2000-01-01(土) を基準として全ての年をグレゴリオ暦で計算しています。 1日は正確に86400秒であるとして日時を扱います。 DateTime は @ref TimeSpan との加減算を提供しています。 DateTime と @ref TimeSpan との加減算により DateTime が得られます。 DateTime 同士の減算により @ref TimeSpan が得られます。 DateTimeの上限と下限は、DateTime 同士の減算で得られる TimeSpan がオーバーフローしないように設定されています。 */ class DateTime { public: /*! :overload noparams @brief 2000-01-01 00:00:00.000 の DateTime オブジェクトを作ります。 */ DateTime() : m_MilliSeconds(0) {} /*! :overload withparams @brief 指定日時の DateTime オブジェクトを作ります。 */ DateTime(s32 year, s32 month, s32 day, s32 hour=0, s32 minute=0, s32 second=0, s32 millisecond=0); /*! @brief 年を取得します。 @return 4桁の西暦を返します。 経過時間からの変換するための計算を含みます。 */ s32 GetYear() const; /*! @brief 月を取得します。 @return 月を 1 から 12 の値で返します。 経過時間からの変換するための計算を含みます。 */ s32 GetMonth() const; /*! @brief 日を取得します。 @return 日を 1 から 31 の値で返します。 経過時間からの変換するための計算を含みます。 */ s32 GetDay() const; /*! @brief 曜日を取得します。 @return 曜日を返します。 経過時間からの変換するための計算を含みます。 */ Week GetWeek() const; /*! @brief 時を取得します。 @return 時を 0 から 23 の値で返します。 経過時間からの変換するための計算を含みます。 */ s32 GetHour() const; /*! @brief 分を取得します。 @return 分を 0 から 59 の値で返します。 経過時間からの変換するための計算を含みます。 */ s32 GetMinute() const; /*! @brief 秒を取得します。 @return 秒を 0 から 59 の値で返します。 経過時間からの変換するための計算を含みます。 */ s32 GetSecond() const; /*! @brief ミリ秒を取得します。 @return ミリ秒を 0 から 999 の値で返します。 経過時間からの変換するための計算を含みます。 */ s32 GetMilliSecond() const; /*! @brief 年月日時分秒の値をまとめて取得します。 @return @ref DateTimeParameters を返します。 */ DateTimeParameters GetParameters() const; /*! @brief 年を置き換えます。 @return 置き換えられた DateTime オブジェクトを返します。 */ DateTime ReplaceYear(s32 year) const; /*! @brief 月を置き換えます。 @return 置き換えられた DateTime オブジェクトを返します。 */ DateTime ReplaceMonth(s32 month) const; /*! @brief 日を置き換えます。 @return 置き換えられた DateTime オブジェクトを返します。 */ DateTime ReplaceDay(s32 day) const; /*! @brief 時を置き換えます。 @return 置き換えられた DateTime オブジェクトを返します。 */ DateTime ReplaceHour(s32 hour) const; /*! @brief 分を置き換えます。 @return 置き換えられた DateTime オブジェクトを返します。 */ DateTime ReplaceMinute(s32 minute) const; /*! @brief 秒を置き換えます。 @return 置き換えられた DateTime オブジェクトを返します。 */ DateTime ReplaceSecond(s32 second) const; /*! @brief ミリ秒を置き換えます。 @return 置き換えられた DateTime オブジェクトを返します。 */ DateTime ReplaceMilliSecond(s32 millisecond) const; /*! @brief DateTime 同士の == 演算です。 */ friend bool operator==(const DateTime& lhs, const DateTime& rhs) { return lhs.m_MilliSeconds == rhs.m_MilliSeconds; } /*! @brief DateTime 同士の != 演算です。 */ friend bool operator!=(const DateTime& lhs, const DateTime& rhs) { return !(lhs == rhs); } /*! @brief DateTime 同士の < 演算です。 */ friend bool operator< (const DateTime& lhs, const DateTime& rhs) { return lhs.m_MilliSeconds < rhs.m_MilliSeconds; } /*! @brief DateTime 同士の > 演算です。 */ friend bool operator> (const DateTime& lhs, const DateTime& rhs) { return rhs < lhs; } /*! @brief DateTime 同士の <= 演算です。 */ friend bool operator<=(const DateTime& lhs, const DateTime& rhs) { return !(lhs > rhs); } /*! @brief DateTime 同士の >= 演算です。 */ friend bool operator>=(const DateTime& lhs, const DateTime& rhs) { return !(lhs < rhs); } /*! @brief DateTime と TimeSpan の += 演算です。 */ DateTime& operator+=(const TimeSpan& rhs) { this->m_MilliSeconds += rhs.GetMilliSeconds(); return *this; } /*! @brief DateTime と TimeSpan の + 演算です。 */ friend DateTime operator+(const DateTime& lhs, const TimeSpan& rhs) { DateTime ret(lhs); return ret += rhs; } /*! @brief DateTime と TimeSpan の -= 演算です。 */ DateTime& operator-=(const TimeSpan& rhs) { this->m_MilliSeconds -= rhs.GetMilliSeconds(); return *this; } /*! @brief DateTime と TimeSpan の - 演算です。 */ friend DateTime operator-(const DateTime& lhs, const TimeSpan& rhs) { DateTime ret(lhs); return ret -= rhs; } /*! @brief DateTime 同士の - 演算です。 MIN_DATETIME から MAX_DATETIME までの値で表される有効な DateTime 同士の減算の結果は、 TimeSpan で表現可能な範囲に収まります。 @return 差の @ref TimeSpan を返します。 */ friend TimeSpan operator-(const DateTime& lhs, const DateTime& rhs) { return TimeSpan::FromMilliSeconds(lhs.m_MilliSeconds - rhs.m_MilliSeconds); } /*! :overload nostruct @brief 年月日時分秒から DateTime オブジェクトを作成します。 暦として有効な日時を指定してください。 無効な日付を指定した結果は不定です。 指定する日時が有効かどうか調べるには、@ref IsValidParameters を使用できます。 @param[in] year 年を指定します。[ 1900 ... 2189] @param[in] month 月を指定します。[ 1 ... 12 ] @param[in] day 日を指定します。[ 1 ... 31 ] @param[in] hour 時を指定します。[ 0 ... 23 ] @param[in] minute 分を指定します。[ 0 ... 59 ] @param[in] second 秒を指定します。[ 0 ... 59 ] @param[in] millisecond ミリ秒を指定します。[ 0 ... 999 ] @return 指定日時の DateTime オブジェクトを返します。 */ static DateTime FromParameters(s32 year, s32 month, s32 day, s32 hour=0, s32 minute=0, s32 second=0, s32 millisecond=0); /*! :overload withstruct @brief 年月日時分秒から DateTime オブジェクトを作成します。 @ref DateTimeParameters での曜日の指定は無視されます。 暦として有効な日時を指定してください。 無効な日付を指定した結果は不定です。 指定する日時が有効かどうか調べるには、@ref IsValidParameters を使用できます。 @param[in] dateTimeParameters DateTimeParameters オブジェクトを指定します。 @return 指定日時の DateTime オブジェクトを返します。 */ static DateTime FromParameters(const DateTimeParameters &dateTimeParameters); /*! @brief 正しい日付か判定します。 @param[in] year 年を指定します。 @param[in] month 月を指定します。 @param[in] day 日を指定します。 @return 正しい日付なら true を返し、不正な日付なら false を返します。 */ static bool IsValidDate(s32 year, s32 month, s32 day); /*! :overload nostruct @brief 正しい日時か判定します。 @param[in] year 年を指定します。 @param[in] month 月を指定します。 @param[in] day 日を指定します。 @param[in] hour 時を指定します。 @param[in] minute 分を指定します。 @param[in] second 秒を指定します。 @param[in] millisecond ミリ秒を指定します。 @return 正しい日時なら true を返し、不正な日時なら false を返します。 */ static bool IsValidParameters(s32 year, s32 month, s32 day, s32 hour=0, s32 minute=0, s32 second=0, s32 millisecond=0); /*! :overload withstruct @brief 正しい日時か判定します。 @param[in] dateTimeParameters DateTimeParameters オブジェクトを指定します。 @return 正しい日時なら true を返し、不正な日時なら false を返します。 */ static bool IsValidParameters(const DateTimeParameters &dateTimeParameters); /*! @brief うるう年かどうか判定します。 @param[in] year 年を指定します。 @return うるう年なら true を返し、平年なら false を返します。 */ static s32 IsLeapYear(s32 year); /*! @brief 年月日から 2000-01-01 からの経過日数を計算します。 @param[in] year 年を指定します。 @param[in] month 月を指定します。 @param[in] day 日を指定します。 @return 経過日数を返します。 有効な日付を指定してください。 無効な日付を指定した結果は不定です。 指定する日付が有効かどうか調べるには、@ref IsValidDate を使用できます。 */ static s32 DateToDays(s32 year, s32 month, s32 day); /*! @brief 2000-01-01 からの経過日数から年月日を計算します。 @param[out] pYear 年を入れるアドレスを指定します。 @param[out] pMonth 月を入れるアドレスを指定します。 @param[out] pDay 日を入れるアドレスを指定します。 @param[in] days 経過日数を指定します。 */ static void DaysToDate(s32 *pYear, s32 *pMonth, s32 *pDay, s32 days); /*! @brief 2000-01-01 からの経過日数から曜日を計算します。 @param[in] days 経過日数を指定します。 @return 曜日を返します。 */ static Week DaysToWeekday(s32 days); /*! @brief 現在の日時を取得します。 @return 現在の日時を返します。 */ static DateTime GetNow(); /*! @brief DateTimeで扱える最も過去の日時です。 */ static const DateTime MIN_DATETIME; /*! @brief DateTimeで扱える最も未来の日時です。 */ static const DateTime MAX_DATETIME; private: s64 m_MilliSeconds; DateTime(s64 milliseconds) : m_MilliSeconds(milliseconds) { NN_ASSERT(MIN_MILLISECONDS <= milliseconds && milliseconds <= MAX_MILLISECONDS); } static const s64 MIN_MILLISECONDS = -3155673600000LL; static const s64 MAX_MILLISECONDS = 5995900800000LL - 1; }; } // namespace fnd { } // namespace nn { #endif // #ifdef __cplusplus #endif // #ifndef NN_FND_DATETIME_API_H_