📄 datetime.cpp
字号:
#include "datetime.h"
#include <stdio.h>
#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__)
# include <windows.h>
#endif
#include <time.h>
#include <exception>
namespace dnc{namespace priv{
inline void now(int &year,int &month,int &day,int &hour,int &minute,int &second,int &milliseconds){
#ifdef WIN32
SYSTEMTIME _tm;
GetLocalTime(&_tm);
year = _tm.wYear;
month = _tm.wMonth;
day = _tm.wDay;
hour = _tm.wHour;
minute = _tm.wMinute;
second = _tm.wSecond;
milliseconds = _tm.wMilliseconds;
#else
time_t currentTime;
::time(¤tTime);
# if _MSC_VER >= 1400
tm tmTime;
localtime_s(&tmTime,&curentTime);
# else
tm &tmTime = *localtime(¤tTime);
# endif
year = tmTime.tm_year+1900;
month = tmTime.tm_mon+1;
day = tmTime.tm_mday;
hour = tmTime.tm_hour;
minute = tmTime.tm_min;
second = tmTime.tm_sec;
milliseconds = 0;
#endif
}
}}
namespace dnc{
Date Date::now(){
int year,month,day,hour,minute,second,milliseconds;
priv::now(year,month,day,hour,minute,second,milliseconds);
return Date(year,month,day);
}
DateTime DateTime::now(){
int year,month,day,hour,minute,second,milliseconds;
priv::now(year,month,day,hour,minute,second,milliseconds);
return DateTime(year,month,day,hour,minute,second,milliseconds);
}
Time Time::now(){
int year,month,day,hour,minute,second,milliseconds;
priv::now(year,month,day,hour,minute,second,milliseconds);
return hour*3600000+minute*60000+second*1000+milliseconds;
}
std::string DateTime::toString()const{
char buffer[64];
sprintf(buffer,"%i-%i-%i %i:%i:%i",year(),month(),day(),hour(),minute(),second());
return buffer;
}
std::string Date::toString() const{
char buffer[64];
sprintf(buffer,"%i-%i-%i",year(),month(),day());
return buffer;
}
std::string Time::toString()const{
char buffer[64];
sprintf(buffer,"%i:%i:%i",hour(),minute(),second());
return buffer;
}
std::string Duration::toString()const{
char buffer[64];
sprintf(buffer,"%i",m_span);
return buffer;
}
class DateError : public std::exception{
public:
DateError(int year,int month,int day):m_year(year),m_month(month),m_day(day){
m_msg[0] = 0;
}
castr what() const throw(){
if(m_msg[0] == 0)
::sprintf(const_cast<DateError*>(this)->m_msg,"DateError:%i-%i-%i",m_year,m_month,m_day);
return m_msg;
}
private:
int m_year,m_month,m_day;
char m_msg[50];
};
class TimeError : public std::exception{
public:
TimeError(int hour,int minute,int second,int millisecond):m_hour(hour),m_minute(minute),m_second(second),m_millisecond(millisecond){
m_msg[0] = 0;
}
castr what() const throw(){
if(m_msg[0] == 0)
::sprintf(const_cast<TimeError*>(this)->m_msg,"TimeError:%i-%i-%i.%i",m_hour,m_minute,m_second,m_millisecond);
return m_msg;
}
private:
int m_hour,m_minute,m_second,m_millisecond;
char m_msg[80];
};
class DateTimeError : public std::exception{
public:
DateTimeError(){}
castr what() const throw(){
return "DateTimeError";
}
};
void DNC_DECLARE throwDateError(int year,int month,int day){
throw DateError(year,month,day);
}
void DNC_DECLARE throwTimeError(int hour,int minute,int second,int millisecond){
throw TimeError(hour,minute,second,millisecond);
}
void DNC_DECLARE throwDateTimeError(){
throw DateTimeError();
}
}
namespace dnc{namespace priv{
int DNC_DECLARE GetStartDayOfYear(int year){
static bool isFirst = true;
static int startDayOfYear[Date::s_maxYear-Date::s_minYear+1];
if(isFirst){
isFirst = false;
int totalDays = 0;
for(int year = Date::s_minYear ;year<=Date::s_maxYear;year++){
startDayOfYear[year-Date::s_minYear] = totalDays;
if(Date::IsLeapYear(year)) totalDays += 366;
else totalDays += 365;
}
}
if(year>Date::s_maxYear || year<Date::s_minYear){
throwDateError(year);
}
return startDayOfYear[year-Date::s_minYear];
}
int DNC_DECLARE GetStartDayOfMonth(int year,int month){
static int s_totalDaysOfMonth[13] = {1,32,60,91,121,152,182,213,244,274,305,335,366};
return Date::IsLeapYear(year) && month>2 ? s_totalDaysOfMonth[month-1]+1 : s_totalDaysOfMonth[month-1];
}
}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -