1 °³¿ä
QT 1.4 (3.0?) ¹öÀü¿¡ ÀÖ´ø QDateTime ¸ðµâÀ» º¸°í, ÇÊ¿äÇÑ ºÎºÐ¸¸ º¯°æÇÑ ¼Ò½º.
ƯÁ¤ ³¯Â¥·ÎºÎÅÍ ¸îÀÏÀÌ Áö³µ´ÂÁö, ÇØ´çÇÏ´Â ³¯Â¥°¡ ¹«½¼ ¿äÀÏÀÎÁö, ³¯Â¥¸¦ ¹®ÀÚ¿·Î º¯È¯, ¹®ÀÚ¿À» ³¯Â¥·Î º¯È¯ µîµî¿¡ ´ëÇÑ Ã³¸®¸¦ À§ÇØ ¸¸µé¾ú´Ù. ÀÌ·± Ŭ·¡½º ÇϳªÂë ¸¸µé¾î µÎÁö ¾ÊÀ¸¸é ³¯Â¥&½Ã°£ ó¸® Àº±ÙÈ÷ ±ÍÂú´Ù.
VisualCpp 7.1 ±âÁØÀε¥, _snprintf ºÎºÐ¸¸ Á¦¿ÜÇϸé, ´Ù¸¥ °÷¿¡¼µµ º° ¹«¸®¾øÀÌ ÄÄÆÄÀ쵃 °ÍÀÌ´Ù. ¹°·Ð Çì´õ ÆÄÀÏ ¹®Á¦´Â ÇØ°áÇØÁà¾ßÇÑ´Ù. precompiled header´Â ÀÌ·± °æ¿ì¿¡ Âü ±ÍÂú´Ù.
2 ¼Ò½º
//////////////////////////////////////////////////////////////////////////////
/// \file DateTime.h
/// \author excel96
/// \date 2003.4.2
///
/// ½Ã°£°ú ³¯Â¥ °è»êÀ» À§ÇÑ Å¬·¡½ºµéÀÇ Çì´õ°¡ µé¾îÀÖ´Â ÆÄÀÏÀÌ´Ù.
/// ´Ü Å« ½ºÄÉÀÏ¿¡¼ÀÇ ½Ã°£À» ´Ù·ç±â À§ÇÑ Å¬·¡½ºµéÀÌ´Ù. Milli-second µîÀÇ
/// ªÀº ½Ã°£À» ´Ù·ç±â¿¡´Â ¾Ë¸ÂÀº Ŭ·¡½ºµéÀÌ ¾Æ´Ï´Ù.
//////////////////////////////////////////////////////////////////////////////
#pragma once
//////////////////////////////////////////////////////////////////////////////
/// \class SFDate
/// \brief ³¯Â¥ °ü¸®¸¦ À§ÇÑ Å¬·¡½ºÀÌ´Ù.
//////////////////////////////////////////////////////////////////////////////
class SFDate
{
friend class SFDateTime;
private:
unsigned int m_DV;
public:
/// \brief »ý¼ºÀÚ
SFDate();
/// \brief »ý¼ºÀÚ
/// \param y ³â
/// \param m ¿ù
/// \param d ÀÏ
SFDate(int y, int m, int d);
/// \brief »ý¼ºÀÚ
/// \param format toString() ÇÔ¼ö·Î »ý¼ºÇÑ °Í°ú °°Àº Æ÷¸ËÀÇ ³¯Â¥ ¹®ÀÚ¿
SFDate(const std::string& format);
public:
/// \brief ÃʱâȰ¡ ¾È µÈ °´Ã¼ÀÎÁöÀÇ ¿©ºÎ¸¦ ¹ÝȯÇÑ´Ù.
/// \return bool ÃʱâȰ¡ ¾È µÇ¾ú´Ù¸é true.
bool isNull() const { return m_DV == 0; }
/// \brief ³¯Â¥°¡ Á¤»óÀûÀ¸·Î ¼³Á¤µÇ¾ú´ÂÁöÀÇ ¿©ºÎ¸¦ ¹ÝȯÇÑ´Ù.
/// \return bool Á¤»óÀûÀÎ ³¯Â¥ÀÏ °æ¿ì true.
bool isValid() const;
/// \brief ¿¬(Ò´)À» ¹ÝȯÇÑ´Ù.
/// \return int 1752..
int year() const;
/// \brief ¿ù(êÅ)À» ¹ÝȯÇÑ´Ù.
/// \return int 1..12
int month() const;
/// \brief ÀÏ(ìí)À» ¹ÝȯÇÑ´Ù.
/// \return int 1..31
int day() const;
/// \brief ¿äÀÏÀ» ¹ÝȯÇÑ´Ù.
/// \return int 1..7 (1 == monday)
int dayOfWeek() const;
/// \brief 1³â Áß¿¡¼ ¸î¹øÂ° ³¯Àΰ¡¸¦ ¹ÝȯÇÑ´Ù.
/// \return int 1..366
int dayOfYear() const;
/// \brief ÇöÀç ³¯Â¥ÀÇ ´ÞÀÌ ¸îÀÏ·Î ÀÌ·ç¾îÁö´Â°¡¸¦ ¹ÝȯÇÑ´Ù.
/// \return int 28..31
int daysInMonth() const;
/// \brief ÇöÀç ³¯Â¥ÀÇ ¿¬µµ°¡ ¸îÀÏ·Î ÀÌ·ç¾îÁö´Â°¡¸¦ ¹ÝȯÇÑ´Ù.
/// \return int 365 or 366
int daysInYear() const;
/// \brief ¿äÀÏÀ» ¹®ÀÚ¿·Î ¹ÝȯÇÑ´Ù.
/// \return const char* ¿äÀÏ ¹®ÀÚ¿
const char* dayOfWeekToString() const;
/// \brief ³â,¿ù,ÀÏÀ» ¼³Á¤ÇÑ´Ù.
/// \param y ³â
/// \param m ¿ù
/// \param d ÀÏ
/// \return bool Á¤»óÀûÀÎ ³¯Â¥ÀÎ °æ¿ì true¸¦ ¹ÝȯÇϰí, À߸øµÈ ³¯ÀÚÀÏ
/// °æ¿ì¿¡´Â false¸¦ ¹ÝȯÇÑ´Ù.
bool setYMD(int y, int m, int d);
/// \brief ÇöÀç ³¯Â¥¿¡´Ù°¡ ÁÖ¾îÁø ¼ýÀÚ¸¸ÅÀÇ Àϼö¸¦ Ãß°¡ÇÑ °´Ã¼¸¦
/// ¹ÝȯÇÑ´Ù.
/// \param ndays Ãß°¡ÇÒ ³¯Â¥
/// \return SFDate ³¯Â¥¸¦ Ãß°¡ÇÑ °´Ã¼
SFDate addDays(int days) const;
/// \brief ÁÖ¾îÁø ³¯Â¥°¡ µÇ·Á¸é ¸îÀÏÀÌ ³²¾Ò´ÂÁö¸¦ ¹ÝȯÇÑ´Ù.
/// \param d ¸ñÇ¥ ³¯Â¥
/// \return int ³²Àº ÀÏ ¼ö
int daysTo(const SFDate &) const;
/// \brief ³â,¿ù,ÀÏÀÇ Á¶ÇÕÀ» ¹®ÀÚ¿·Î ¹ÝȯÇÑ´Ù.
/// \return std::string °á°ú ¹®ÀÚ¿
std::string toString() const;
public:
/// \name ºñ±³ ¿¬»êÀÚ ¿À¹ö·Îµå
/// \{
bool operator == (const SFDate &d) const { return m_DV == d.m_DV; }
bool operator != (const SFDate &d) const { return m_DV != d.m_DV; }
bool operator < (const SFDate &d) const { return m_DV < d.m_DV; }
bool operator <= (const SFDate &d) const { return m_DV <= d.m_DV; }
bool operator > (const SFDate &d) const { return m_DV > d.m_DV; }
bool operator >= (const SFDate &d) const { return m_DV >= d.m_DV; }
/// \}
public:
/// \brief ·ÎÄà ¸Ó½ÅÀÇ ÇöÀç ³¯Â¥¸¦ ¾ò¾î³» ¹ÝȯÇÑ´Ù.
/// \return SFDate ÇöÀç ³¯Â¥
static SFDate current();
/// \brief ÁÖ¾îÁø ³¯Â¥°¡ Á¤»óÀûÀÎ ³¯Â¥ÀÎÁöÀÇ ¿©ºÎ¸¦ ¹ÝȯÇÑ´Ù.
/// \param y ³â
/// \param m ¿ù
/// \param d ÀÏ
/// \return bool Á¤»óÀûÀÎ ³¯Â¥¶ó¸é true, ¾Æ´Ï¶ó¸é false
static bool isValid(int y, int m, int d);
/// \brief ÁÖ¾îÁø ³âµµ°¡ À±³âÀÎÁöÀÇ ¿©ºÎ¸¦ ¹ÝȯÇÑ´Ù.
/// \param y ³âµµ
/// \return bool À±³âÀ̶ó¸é true, À±³âÀÌ ¾Æ´Ï¶ó¸é false
static bool isLeapYear(int year);
/// \brief ³â,¿ù,ÀÏ °ªÀ» ¹Þ¾Æ¼ ÇϳªÀÇ int·Î º¯È¯ÇÑ´Ù.
/// \param y ³â
/// \param m ¿ù
/// \param d ÀÏ
/// \return unsigned int º¯È¯ °á°ú°ª
static unsigned int greg2jul(int y, int m, int d);
/// \brief int °ªÀ» ³â,¿ù,ÀÏ·Î ºÐ¸®ÇÑ´Ù.
/// \param jd ºÐ¸®ÇÒ int °ª
/// \param y ³â
/// \param m ¿ù
/// \param d ÀÏ
static void jul2greg(unsigned int jd, int &y, int &m, int &d);
};
//////////////////////////////////////////////////////////////////////////////
/// \class SFTime
/// \brief ½Ã°£ °ü¸®¸¦ À§ÇÑ Å¬·¡½ºÀÌ´Ù.
//////////////////////////////////////////////////////////////////////////////
class SFTime
{
friend class SFDateTime;
private:
unsigned int m_TV;
public:
/// \brief »ý¼ºÀÚ
SFTime();
/// \brief »ý¼ºÀÚ
/// \param h ½Ã
/// \param m ºÐ
/// \param s ÃÊ
/// \param ms ¹Ð¸®ÃÊ
SFTime(int h, int m, int s=0, int ms=0);
/// \brief »ý¼ºÀÚ
/// \param format toString() ÇÔ¼ö·Î »ý¼ºÇÑ °Í°ú °°Àº Æ÷¸ËÀÇ ³¯Â¥ ¹®ÀÚ¿
SFTime(const std::string& format);
public:
/// \brief ÃʱâȰ¡ ¾È µÈ °´Ã¼ÀÎÁöÀÇ ¿©ºÎ¸¦ ¹ÝȯÇÑ´Ù.
/// \return bool ÃʱâȰ¡ ¾È µÈ °´Ã¼ÀÏ °æ¿ì true
bool isNull() const { return m_TV == 0; }
/// \brief ½Ã°£ÀÌ Á¤»óÀûÀ¸·Î ¼³Á¤µÇ¾ú´ÂÁöÀÇ ¿©ºÎ¸¦ ¹ÝȯÇÑ´Ù.
/// \return bool Á¤»óÀûÀ¸·Î ¼³Á¤µÇ¾ú´Ù¸é true¸¦ ¹Ýȯ, ¾Æ´Ï¶ó¸é false.
bool isValid() const;
/// \brief ½Ã¸¦ ¹ÝȯÇÑ´Ù.
/// \return int 0..23
int hour() const;
/// \brief ºÐÀ» ¹ÝȯÇÑ´Ù.
/// \return int 0..59
int minute() const;
/// \brief Ãʸ¦ ¹ÝȯÇÑ´Ù.
/// \return int 0..59
int second() const;
/// \brief ¹Ð¸®Ãʸ¦ ¹ÝȯÇÑ´Ù.
/// \return int 0..999
int msec() const;
/// \brief ½Ã,ºÐ,ÃÊ,¹Ð¸®Ãʸ¦ ¼³Á¤ÇÑ´Ù.
/// \param h ½Ã
/// \param m ºÐ
/// \param s ÃÊ
/// \param ms ¹Ð¸®ÃÊ
/// \return bool ÁÖ¾îÁø ½Ã°£ÀÌ Á¤»óÀûÀÎ °ÍÀÏ °æ¿ì true¸¦ ¹ÝȯÇϰí, À߸øµÈ
/// ½Ã°£ÀÏ °æ¿ì¿¡´Â false¸¦ ¹ÝȯÇÑ´Ù.
bool setHMS(int h, int m, int s, int ms=0);
/// \brief ÇöÀç ½Ã°£¿¡´Ù°¡ ÁÖ¾îÁø ¾ç¸¸ÅÀÇ Ãʸ¦ ´õÇÑ °´Ã¼¸¦ ¹ÝȯÇÑ´Ù.
/// \param nsecs Ãß°¡ÇÒ ÃÊ
/// \return SFTime ÁÖ¾îÁø Ãʸ¦ Ãß°¡ÇÑ °´Ã¼
SFTime addSecs(int secs) const;
/// \brief ÇöÀç ½Ã°£¿¡´Ù°¡ ÁÖ¾îÁø ¾ç¸¸ÅÀÇ ¹Ð¸®Ãʸ¦ ´õÇÑ °´Ã¼¸¦ ¹ÝȯÇÑ´Ù.
/// \param ms Ãß°¡ÇÒ ¹Ð¸®ÃÊ
/// \return SFTime ÁÖ¾îÁø ¹Ð¸®Ãʸ¦ Ãß°¡ÇÑ °´Ã¼
SFTime addMSecs(int ms) const;
/// \brief ÁÖ¾îÁø ½Ã°£ÀÌ µÇ·Á¸é ¸î Ãʰ¡ ³²¾Ò´ÂÁö¸¦ ¹ÝȯÇÑ´Ù.
/// \param t ¸ñÇ¥ ½Ã°£
/// \return int ³²Àº ÃÊ
int secsTo(const SFTime &) const;
/// \brief ÁÖ¾îÁø ½Ã°£ÀÌ µÇ·Á¸é ¸î ¹Ð¸®Ãʰ¡ ³²¾Ò´ÂÁö¸¦ ¹ÝȯÇÑ´Ù.
/// \param t ¸ñÇ¥ ½Ã°£
/// \return int ³²Àº ¹Ð¸®ÃÊ
int msecsTo(const SFTime &) const;
/// \brief ½Ã,ºÐ,ÃÊ,¹Ð¸®ÃÊÀÇ Á¶ÇÕÀ» ¹®ÀÚ¿·Î ¹ÝȯÇÑ´Ù.
/// \return std::string °á°ú ¹®ÀÚ¿
std::string toString() const;
/// \brief ½Ã,ºÐ,ÃÊÀÇ Á¶ÇÕÀ» ¹®ÀÚ¿·Î ¹ÝȯÇÑ´Ù.
/// \return std::string °á°ú ¹®ÀÚ¿
std::string toShortString() const;
public:
/// \name ºñ±³ ¿¬»êÀÚ ¿À¹ö·Îµå
/// \{
bool operator == (const SFTime &d) const { return m_TV == d.m_TV; }
bool operator != (const SFTime &d) const { return m_TV != d.m_TV; }
bool operator < (const SFTime &d) const { return m_TV < d.m_TV; }
bool operator <= (const SFTime &d) const { return m_TV <= d.m_TV; }
bool operator > (const SFTime &d) const { return m_TV > d.m_TV; }
bool operator >= (const SFTime &d) const { return m_TV >= d.m_TV; }
/// \}
public:
/// \brief ·ÎÄà ¸Ó½ÅÀÇ ÇöÀç ½Ã°£À» ¾ò¾î³» ¹ÝȯÇÑ´Ù.
/// \return SFTime ÇöÀç ½Ã°£
static SFTime current();
/// \brief ·ÎÄà ¸Ó½ÅÀÇ ÇöÀç ½Ã°£À» ¾ò¾î³½´Ù.
/// \param ct ÇöÀç ½Ã°£À» ±â·ÏÇÒ °´Ã¼
/// \return bool ÇöÀç ½Ã°£ÀÌ ³¯Â¥°¡ °ÅÀÇ ¹Ù²ð ¹«·ÆÀÏ °æ¿ì true¸¦ ¹ÝȯÇÑ´Ù.
static bool current(SFTime*);
/// \brief ÁÖ¾îÁø ½Ã°£ÀÌ Á¤»óÀûÀÎ ½Ã°£ÀÎÁöÀÇ ¿©ºÎ¸¦ ¹ÝȯÇÑ´Ù.
/// \return bool Á¤»óÀûÀÎ ½Ã°£ÀÏ °æ¿ì true¸¦, ¾Æ´Ò °æ¿ì false¸¦ ¹ÝȯÇÑ´Ù.
static bool isValid(int h, int m, int s, int ms=0);
};
//////////////////////////////////////////////////////////////////////////////
/// \class SFDateTime
/// \brief SFDate¿Í SFTime Ŭ·¡½ºÀÇ Á¶ÇÕ °´Ã¼·Î¼ ³¯Â¥¿Í ½Ã°£À» µ¿½Ã¿¡ °ü¸®Çϱâ
/// À§ÇÑ Å¬·¡½ºÀÌ´Ù.
//////////////////////////////////////////////////////////////////////////////
class SFDateTime
{
private:
SFDate m_Date;
SFTime m_Time;
public:
/// \brief »ý¼ºÀÚ
SFDateTime();
/// \brief »ý¼ºÀÚ
/// \param d ¼³Á¤ÇÒ ³¯Â¥ °´Ã¼
SFDateTime(const SFDate &d);
/// \brief »ý¼ºÀÚ
/// \param d ¼³Á¤ÇÒ ³¯Â¥ °´Ã¼
/// \param t ¼³Á¤ÇÒ ½Ã°£ °´Ã¼
SFDateTime(const SFDate &d, const SFTime &t);
/// \brief »ý¼ºÀÚ
/// \param format toString() ÇÔ¼ö·Î »ý¼ºÇÑ °Í°ú °°Àº Æ÷¸ËÀÇ ³¯Â¥ ¹®ÀÚ¿
SFDateTime(const std::string& format);
public:
/// \brief ÃʱâȰ¡ ¾È µÈ °´Ã¼ÀÎÁöÀÇ ¿©ºÎ¸¦ ¹ÝȯÇÑ´Ù.
/// \return bool ÃʱâȰ¡ ¾È µÈ °´Ã¼ÀÏ °æ¿ì true
bool isNull() const { return m_Date.isNull() || m_Time.isNull(); }
/// \brief ³¯Â¥ ¹× ½Ã°£ÀÌ Á¤»óÀûÀ¸·Î ¼³Á¤µÇ¾ú´ÂÁöÀÇ ¿©ºÎ¸¦ ¹ÝȯÇÑ´Ù.
/// \return bool Á¤»óÀûÀÎ ³¯Â¥, ½Ã°£ÀÎ °æ¿ì true
bool isValid() const { return m_Date.isValid() && m_Time.isValid(); }
/// \brief ³¯Â¥ °´Ã¼ÀÇ ÂüÁ¶¸¦ ¹ÝȯÇÑ´Ù.
/// \return const SFDate& ³¯Â¥ °´Ã¼ÀÇ ÂüÁ¶
const SFDate& date() const { return m_Date; }
/// \brief ½Ã°£ °´Ã¼ÀÇ ÂüÁ¶¸¦ ¹ÝȯÇÑ´Ù.
/// \return const SFTime& ½Ã°£ °´Ã¼ÀÇ ÂüÁ¶
const SFTime& time() const { return m_Time; }
/// \brief ³¯Â¥¸¦ ¼³Á¤ÇÑ´Ù.
/// \param d ¼³Á¤ÇÒ ³¯Â¥
void setDate(const SFDate& d) { m_Date = d; }
/// \brief ½Ã°£À» ¼³Á¤ÇÑ´Ù.
/// \param t ¼³Á¤ÇÒ ½Ã°£
void setTime(const SFTime& t) { m_Time = t; }
/// \brief ¿¬(Ò´)À» ¹ÝȯÇÑ´Ù.
/// \return int ³â
int year() const { return m_Date.year(); }
/// \brief ¿ù(êÅ)À» ¹ÝȯÇÑ´Ù.
/// \return int ¿ù
int month() const { return m_Date.month(); }
/// \brief ÀÏ(ìí)À» ¹ÝȯÇÑ´Ù.
/// \return int ÀÏ
int day() const { return m_Date.day(); }
/// \brief ½Ã¸¦ ¹ÝȯÇÑ´Ù.
/// \return int ½Ã
int hour() const { return m_Time.hour(); }
/// \brief ºÐÀ» ¹ÝȯÇÑ´Ù.
/// \return int ºÐ
int minute() const { return m_Time.minute(); }
/// \brief Ãʸ¦ ¹ÝȯÇÑ´Ù.
/// \return int ÃÊ
int second() const { return m_Time.second(); }
/// \brief ¹Ð¸®Ãʸ¦ ¹ÝȯÇÑ´Ù.
/// \return int ¹Ð¸®ÃÊ
int msec() const { return m_Time.msec(); }
/// \brief time_t °ªÀ» ÀÌ¿ëÇØ ³¯Â¥ ¹× ½Ã°£À» ¼³Á¤ÇÑ´Ù.
/// \param SecondsSince1970_01_01_UTC time_t °ª
void setSFTime_t(unsigned int SecondsSince1970_01_01_UTC);
/// \brief ÇöÀç ³¯Â¥ ¹× ½Ã°£¿¡´Ù°¡ ÁÖ¾îÁø ¼ýÀÚ¸¸ÅÀÇ ÀÏÀ» Ãß°¡ÇÑ °´Ã¼¸¦
/// ¹ÝȯÇÑ´Ù.
/// \param ndays Ãß°¡ÇÒ ³¯Â¥
/// \return SFDateTime Ãß°¡ÇÑ °´Ã¼
SFDateTime addDays(int days) const;
/// \brief ÇöÀç ³¯Â¥ ¹× ½Ã°£¿¡´Ù°¡ ÁÖ¾îÁø ¼ýÀÚ¸¸ÅÀÇ Ãʸ¦ Ãß°¡ÇÑ °´Ã¼¸¦
/// ¹ÝȯÇÑ´Ù.
/// \param secs Ãß°¡ÇÒ ÃÊ
/// \return SFDateTime Ãß°¡ÇÑ °´Ã¼
SFDateTime addSecs(int secs) const;
/// \brief ÇöÀç ³¯Â¥ ¹× ½Ã°£¿¡´Ù°¡ ÁÖ¾îÁø ¼ýÀÚ¸¸ÅÀÇ ¹Ð¸®Ãʸ¦ Ãß°¡ÇÑ
/// °´Ã¼¸¦ ¹ÝȯÇÑ´Ù.
/// \param nsecs Ãß°¡ÇÒ ¹Ð¸®ÃÊ
/// \return SFDateTime Ãß±¸ÇÑ °´Ã¼
SFDateTime addMSecs(int secs) const;
/// \brief ÁÖ¾îÁø ³¯Â¥°¡ µÇ·Á¸é ¸îÀÏÀÌ ³²¾Ò´ÂÁö¸¦ ¹ÝȯÇÑ´Ù.
/// \param dt ¸ñÇ¥ ½Ã°£
/// \return int ³²Àº ³¯Â¥
int daysTo(const SFDateTime&) const;
/// \brief ÁÖ¾îÁø ³¯Â¥°¡ µÇ·Á¸é ¸îÃʰ¡ ³²¾Ò´ÂÁö¸¦ ¹ÝȯÇÑ´Ù.
/// \param dt ¸ñÇ¥ ½Ã°£
/// \return int ³²Àº ³¯Â¥
int secsTo(const SFDateTime&) const;
/// \brief ÁÖ¾îÁø ³¯Â¥°¡ µÇ·Á¸é ¸î ¹Ð¸®Ãʰ¡ ³²¾Ò´ÂÁö¸¦ ¹ÝȯÇÑ´Ù.
/// \param dt ¸ñÇ¥ ½Ã°£
/// \return int ³²Àº ³¯Â¥
int msecsTo(const SFDateTime&) const;
/// \brief ³â,¿ù,ÀÏ,½Ã,ºÐ,ÃÊ,¹Ð¸®ÃÊÀÇ Á¶ÇÕÀ» ¹®ÀÚ¿·Î ¹ÝȯÇÑ´Ù.
/// \return std::string °á°ú ¹®ÀÚ¿
std::string toString() const;
public:
/// \name ºñ±³ ¿¬»êÀÚ ¿À¹ö·Îµå
/// \{
bool operator == (const SFDateTime &dt) const {
return m_Time == dt.m_Time && m_Date == dt.m_Date;
}
bool operator != (const SFDateTime &dt) const {
return m_Time != dt.m_Time || m_Date != dt.m_Date;
}
bool operator < (const SFDateTime &dt) const {
if (m_Date < dt.m_Date) return true;
return m_Date == dt.m_Date ? m_Time < dt.m_Time : false;
}
bool operator <= (const SFDateTime &dt) const {
if (m_Date < dt.m_Date) return true;
return m_Date == dt.m_Date ? m_Time <= dt.m_Time : false;
}
bool operator > (const SFDateTime &dt) const {
if (m_Date > dt.m_Date) return true;
return m_Date == dt.m_Date ? m_Time > dt.m_Time : false;
}
bool operator >= (const SFDateTime &dt) const {
if (m_Date > dt.m_Date) return true;
return m_Date == dt.m_Date ? m_Time >= dt.m_Time : false;
}
/// \}
public:
/// \brief ·ÎÄà ¸Ó½ÅÀÇ ÇöÀç ³¯Â¥ ¹× ½Ã°£À» ¾ò¾î³» ¹ÝȯÇÑ´Ù.
/// \return SFDateTime ÇöÀç ³¯Â¥ ¹× ½Ã°£
static SFDateTime current();
};
datetime.cpp
//////////////////////////////////////////////////////////////////////////////
/// \file DateTime.cpp
/// \author excel96
/// \date 2003.4.2
///
/// ½Ã°£°ú ³¯Â¥ °è»êÀ» À§ÇÑ Å¬·¡½ºµéÀÇ Çì´õ°¡ µé¾îÀÖ´Â ÆÄÀÏÀÌ´Ù.
/// ´Ü Å« ½ºÄÉÀÏ¿¡¼ÀÇ ½Ã°£À» ´Ù·ç±â À§ÇÑ Å¬·¡½ºµéÀÌ´Ù. Milli-second µîÀÇ
/// ªÀº ½Ã°£À» ´Ù·ç±â¿¡´Â ¾Ë¸ÂÀº Ŭ·¡½ºµéÀÌ ¾Æ´Ï´Ù.
//////////////////////////////////////////////////////////////////////////////
#include "SFCPCH.h"
#include "DateTime.h"
#include <time.h>
static const unsigned int FIRST_DAY = 2361222; // Julian day for 1752/09/14
static const int FIRST_YEAR = 1752; // ### wrong for many countries
static const unsigned int SECS_PER_DAY = 86400; // ÇÏ·ç°¡ ¸î ÃÊÀΰ¡
static const unsigned int MSECS_PER_DAY = 86400000; // ÇÏ·ç°¡ ¸î ¹Ð¸®ÃÊÀΰ¡
static const unsigned int SECS_PER_HOUR = 3600; // ÇÑ ½Ã°£ÀÌ ¸î ÃÊÀΰ¡
static const unsigned int MSECS_PER_HOUR = 3600000; // ÇÑ ½Ã°£ÀÌ ¸î ¹Ð¸®ÃÊÀΰ¡
static const unsigned int SECS_PER_MIN = 60; // 1ºÐÀÌ ¸î ÃÊÀΰ¡
static const unsigned int MSECS_PER_MIN = 60000; // 1ºÐÀÌ ¸î ¹Ð¸®ÃÊÀΰ¡
// ÇÑ´ÞÀÌ ¸î ÀÏÀΰ¡?
static const short g_pDaysInMonth[] =
{
0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
// ¿äÀÏ
static const char* g_pWeeks[] =
{
// "", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"
"", "¿ù", "È", "¼ö", "¸ñ", "±Ý", "Åä", "ÀÏ"
};
// ½Ã°£ °ü·Ã Ŭ·¡½ºÀÇ fromString ÇÔ¼ö¿¡¼ ¹®ÀÚ¿À» ÀоîµéÀ̱â À§ÇÑ »ó¼ö
static const char g_SFDateSep = '-';
static const char g_SFTimeSep = ':';
static const char g_SFDateTimeSep = '~';
static std::string trim(const std::string& text)
{
static const std::string whitespaces = " \t\r\n";
std::string str = text;
str = str.erase(text.find_last_not_of(whitespaces) + 1);
return str.erase(0, str.find_first_not_of(whitespaces));
}
//////////////////////////////////////////////////////////////////////////////
/// \brief »ý¼ºÀÚ
//////////////////////////////////////////////////////////////////////////////
SFDate::SFDate()
: m_DV(0)
{
}
//////////////////////////////////////////////////////////////////////////////
/// \brief »ý¼ºÀÚ
/// \param y ³â
/// \param m ¿ù
/// \param d ÀÏ
//////////////////////////////////////////////////////////////////////////////
SFDate::SFDate(int y, int m, int d)
: m_DV(0)
{
setYMD(y, m, d);
}
//////////////////////////////////////////////////////////////////////////////
/// \brief »ý¼ºÀÚ
/// \param format toString() ÇÔ¼ö·Î »ý¼ºÇÑ °Í°ú °°Àº Æ÷¸ËÀÇ ³¯Â¥ ¹®ÀÚ¿
//////////////////////////////////////////////////////////////////////////////
SFDate::SFDate(const std::string& format)
: m_DV(0)
{
std::string text = trim(format);
// ÀÏÁ¤ ±æÀÌ ÀÌ»óÀÌ ¾È µÈ´Ù¸é, ÀÌ»óÇÑ ¹®ÀÚ¿ÀÌ´Ù.
if (text.size() < 8) return;
size_t a = text.find_first_of(g_SFDateSep, 0 );
size_t b = text.find_first_of(g_SFDateSep, a+1);
// Æ÷¸ËÀÌ ¸ÂÁö ¾Ê´Â´Ù¸é, ÀÌ»óÇÑ ¹®ÀÚ¿ÀÌ´Ù.
if (a > b || b > text.size()) return;
setYMD(
atoi(text.substr( 0, a).c_str()),
atoi(text.substr(a+1, b-a-1).c_str()),
atoi(text.substr(b+1, text.size()-b-1).c_str())
);
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ³¯Â¥°¡ Á¤»óÀûÀ¸·Î ¼³Á¤µÇ¾ú´ÂÁöÀÇ ¿©ºÎ¸¦ ¹ÝȯÇÑ´Ù.
/// \return bool Á¤»óÀûÀÎ ³¯Â¥ÀÏ °æ¿ì true.
//////////////////////////////////////////////////////////////////////////////
bool SFDate::isValid() const
{
return m_DV >= FIRST_DAY;
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ¿¬(Ò´)À» ¹ÝȯÇÑ´Ù.
/// \return int 1752..
//////////////////////////////////////////////////////////////////////////////
int SFDate::year() const
{
int y, m, d;
jul2greg(m_DV, y, m, d);
return y;
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ¿ù(êÅ)À» ¹ÝȯÇÑ´Ù.
/// \return int 1..12
//////////////////////////////////////////////////////////////////////////////
int SFDate::month() const
{
int y, m, d;
jul2greg(m_DV, y, m, d);
return m;
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ÀÏ(ìí)À» ¹ÝȯÇÑ´Ù.
/// \return int 1..31
//////////////////////////////////////////////////////////////////////////////
int SFDate::day() const
{
int y, m, d;
jul2greg(m_DV, y, m, d);
return d;
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ¿äÀÏÀ» ¹ÝȯÇÑ´Ù.
/// \return int 1..7 (1 == monday)
//////////////////////////////////////////////////////////////////////////////
int SFDate::dayOfWeek() const
{
return (((m_DV+1) % 7) + 6)%7 + 1;
}
//////////////////////////////////////////////////////////////////////////////
/// \brief 1³â Áß¿¡¼ ¸î¹øÂ° ³¯Àΰ¡¸¦ ¹ÝȯÇÑ´Ù.
/// \return int 1..366
//////////////////////////////////////////////////////////////////////////////
int SFDate::dayOfYear() const
{
return m_DV - greg2jul(year(), 1, 1) + 1;
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ÇöÀç ³¯Â¥ÀÇ ´ÞÀÌ ¸îÀÏ·Î ÀÌ·ç¾îÁö´Â°¡¸¦ ¹ÝȯÇÑ´Ù.
/// \return int 28..31
//////////////////////////////////////////////////////////////////////////////
int SFDate::daysInMonth() const
{
int y, m, d;
jul2greg(m_DV, y, m, d);
if (m == 2 && isLeapYear(y)) return 29;
else return g_pDaysInMonth[m];
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ÇöÀç ³¯Â¥ÀÇ ¿¬µµ°¡ ¸îÀÏ·Î ÀÌ·ç¾îÁö´Â°¡¸¦ ¹ÝȯÇÑ´Ù.
/// \return int 365 or 366
//////////////////////////////////////////////////////////////////////////////
int SFDate::daysInYear() const
{
int y, m, d;
jul2greg(m_DV, y, m, d);
return isLeapYear(y) ? 366 : 365;
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ¿äÀÏÀ» ¹®ÀÚ¿·Î ¹ÝȯÇÑ´Ù.
/// \return const char* ¿äÀÏ ¹®ÀÚ¿
//////////////////////////////////////////////////////////////////////////////
const char* SFDate::dayOfWeekToString() const
{
return g_pWeeks[dayOfWeek()];
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ³â,¿ù,ÀÏÀ» ¼³Á¤ÇÑ´Ù.
/// \param y ³â
/// \param m ¿ù
/// \param d ÀÏ
/// \return bool Á¤»óÀûÀÎ ³¯Â¥ÀÎ °æ¿ì true¸¦ ¹ÝȯÇϰí, À߸øµÈ ³¯ÀÚÀÏ
/// °æ¿ì¿¡´Â false¸¦ ¹ÝȯÇÑ´Ù.
//////////////////////////////////////////////////////////////////////////////
bool SFDate::setYMD(int y, int m, int d)
{
if (!isValid(y,m,d)) return false;
m_DV = greg2jul(y, m, d);
//Assert(year() == (y > 99 ? y : 1900+y) && month() == m && day() == d);
return true;
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ÇöÀç ³¯Â¥¿¡´Ù°¡ ÁÖ¾îÁø ¼ýÀÚ¸¸ÅÀÇ Àϼö¸¦ Ãß°¡ÇÑ °´Ã¼¸¦ ¹ÝȯÇÑ´Ù.
/// \param ndays Ãß°¡ÇÒ ³¯Â¥
/// \return SFDate ³¯Â¥¸¦ Ãß°¡ÇÑ °´Ã¼
//////////////////////////////////////////////////////////////////////////////
SFDate SFDate::addDays(int ndays) const
{
SFDate d;
d.m_DV = m_DV + ndays;
return d;
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ÁÖ¾îÁø ³¯Â¥°¡ µÇ·Á¸é ¸îÀÏÀÌ ³²¾Ò´ÂÁö¸¦ ¹ÝȯÇÑ´Ù.
/// \param d ¸ñÇ¥ ³¯Â¥
/// \return int ³²Àº ÀÏ ¼ö
//////////////////////////////////////////////////////////////////////////////
int SFDate::daysTo(const SFDate &d) const
{
return d.m_DV - m_DV;
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ³â,¿ù,ÀÏÀÇ Á¶ÇÕÀ» ¹®ÀÚ¿·Î ¹ÝȯÇÑ´Ù.
///
/// ´Ù¸¥ °÷¿¡¼µµ ÀÌ ¹®ÀÚ¿À» »ç¿ëÇÏ´Ï ÇԺηΠ¼öÁ¤ÇÏÁö ¸» °Í.
///
/// \return std::string °á°ú ¹®ÀÚ¿
//////////////////////////////////////////////////////////////////////////////
std::string SFDate::toString() const
{
int y, m, d;
jul2greg(m_DV, y, m, d);
char buf[20] = {0, };
_snprintf(buf, sizeof(buf)-1,
"%04d%c%02d%c%02d", y, g_SFDateSep, m, g_SFDateSep, d);
buf[sizeof(buf)-1] = 0;
return std::string(buf);
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ·ÎÄà ¸Ó½ÅÀÇ ÇöÀç ³¯Â¥¸¦ ¾ò¾î³» ¹ÝȯÇÑ´Ù.
/// \return SFDate ÇöÀç ³¯Â¥
//////////////////////////////////////////////////////////////////////////////
SFDate SFDate::current()
{
SFDate d;
SYSTEMTIME t;
memset(&t, 0, sizeof(SYSTEMTIME));
::GetLocalTime(&t);
d.m_DV = greg2jul(t.wYear, t.wMonth, t.wDay);
return d;
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ÁÖ¾îÁø ³¯Â¥°¡ Á¤»óÀûÀÎ ³¯Â¥ÀÎÁöÀÇ ¿©ºÎ¸¦ ¹ÝȯÇÑ´Ù.
/// \param y ³â
/// \param m ¿ù
/// \param d ÀÏ
/// \return bool Á¤»óÀûÀÎ ³¯Â¥¶ó¸é true, ¾Æ´Ï¶ó¸é false
//////////////////////////////////////////////////////////////////////////////
bool SFDate::isValid(int y, int m, int d)
{
if (y >= 0 && y <= 99) y += 1900;
else if (y < FIRST_YEAR || (y == FIRST_YEAR && (m < 9 || (m == 9 && d < 14)))) return false;
return (d > 0 && m > 0 && m <= 12) && (d <= g_pDaysInMonth[m] || (d == 29 && m == 2 && isLeapYear(y)));
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ÁÖ¾îÁø ³âµµ°¡ À±³âÀÎÁöÀÇ ¿©ºÎ¸¦ ¹ÝȯÇÑ´Ù.
/// \param y ³âµµ
/// \return bool À±³âÀ̶ó¸é true, À±³âÀÌ ¾Æ´Ï¶ó¸é false
//////////////////////////////////////////////////////////////////////////////
bool SFDate::isLeapYear(int y)
{
return (y % 4 == 0 && y % 100 != 0 || y % 400 == 0);
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ³â,¿ù,ÀÏ °ªÀ» ¹Þ¾Æ¼ ÇϳªÀÇ int·Î º¯È¯ÇÑ´Ù.
/// \param y ³â
/// \param m ¿ù
/// \param d ÀÏ
/// \return unsigned int º¯È¯ °á°ú°ª
//////////////////////////////////////////////////////////////////////////////
unsigned int SFDate::greg2jul(int y, int m, int d)
{
unsigned int c, ya;
if (y <= 99) y += 1900;
if (m > 2) {
m -= 3;
}
else {
m += 9;
y--;
}
c = y; // NOTE: Sym C++ 6.0 bug
c /= 100;
ya = y - 100*c;
return 1721119 + d + ((146097*c)/4) + ((1461*ya)/4) + ((153*m+2)/5);
}
//////////////////////////////////////////////////////////////////////////////
/// \brief int °ªÀ» ³â,¿ù,ÀÏ·Î ºÐ¸®ÇÑ´Ù.
/// \param jd ºÐ¸®ÇÒ int °ª
/// \param y ³â
/// \param m ¿ù
/// \param d ÀÏ
//////////////////////////////////////////////////////////////////////////////
void SFDate::jul2greg(unsigned int jd, int &y, int &m, int &d)
{
unsigned int x;
unsigned int j = jd - 1721119;
y = ((j*4) - 1) / 146097;
j = (j*4) - (146097*y) - 1;
x = j / 4;
j = ((x*4) + 3) / 1461;
y = (100*y) + j;
x = (x*4) + 3 - (1461*j);
x = (x + 4) / 4;
m = ((5*x) - 3) / 153;
x = (5*x) - 3 - (153*m);
d = (x + 5) / 5;
if (m < 10) {
m += 3;
}
else {
m -= 9;
y++;
}
}
//////////////////////////////////////////////////////////////////////////////
/// \brief »ý¼ºÀÚ
//////////////////////////////////////////////////////////////////////////////
SFTime::SFTime()
: m_TV(0)
{
}
//////////////////////////////////////////////////////////////////////////////
/// \brief »ý¼ºÀÚ
/// \param h ½Ã
/// \param m ºÐ
/// \param s ÃÊ
/// \param ms ¹Ð¸®ÃÊ
//////////////////////////////////////////////////////////////////////////////
SFTime::SFTime(int h, int m, int s, int ms)
: m_TV(0)
{
setHMS(h, m, s, ms);
}
//////////////////////////////////////////////////////////////////////////////
/// \brief »ý¼ºÀÚ
/// \param format toString() ÇÔ¼ö·Î »ý¼ºÇÑ °Í°ú °°Àº Æ÷¸ËÀÇ ³¯Â¥ ¹®ÀÚ¿
//////////////////////////////////////////////////////////////////////////////
SFTime::SFTime(const std::string& format)
: m_TV(0)
{
std::string text = trim(format);
// ÀÏÁ¤ ±æÀÌ ÀÌ»óÀÌ ¾È µÈ´Ù¸é, ÀÌ»óÇÑ ¹®ÀÚ¿ÀÌ´Ù.
if (text.size() < 5) return;
size_t a = text.find_first_of(g_SFTimeSep, 0 );
size_t b = text.find_first_of(g_SFTimeSep, a+1);
size_t c = text.find_first_of(g_SFTimeSep, b+1);
// Æ÷¸ËÀÌ ¸ÂÁö ¾Ê´Â´Ù¸é, ÀÌ»óÇÑ ¹®ÀÚ¿ÀÌ´Ù.
if (a > b || b > text.size()) return;
setHMS(
atoi(text.substr( 0, a ).c_str()),
atoi(text.substr(a+1, b - a - 1).c_str()),
atoi(text.substr(b+1, c - b - 1).c_str()),
atoi(text.substr(c+1, text.size() - c - 1).c_str())