⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datetime.cpp

📁 预处理宏工具
💻 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(&currentTime);
#   if _MSC_VER >= 1400
            tm tmTime;
            localtime_s(&tmTime,&curentTime);
#   else
		    tm &tmTime = *localtime(&currentTime);
#   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 + -