小白C++入坑学废之旅(八)-创新互联

在开始入坑C++的时间魔法学习的开始,我曾发下宏愿,希望能够通过所学构建一个自己的好用的C++的时间帮助类。它需要具有下面一些特性:

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名与空间、虚拟主机、营销软件、网站建设、社旗网站维护、网站推广。
  1. 可以获取当前本地的最新时间。
  2. 可以通过millisecond构建时间。
  3. 可以获取时间中的year, month以及day部分数值,甚至hour, minute和second等。
  4. 可以format输出特定的时间戳字符串。
  5. 可以parse特定的时间戳字符串并构建时间。
  6. 可以对year,month, day,hour,minute,second各刻度上进行加减算术运算。
  7. 可以判断两个时间的早晚。

进过一段时间的努力,C++的时间魔法的学习要渐渐迎来它的落幕。今天在这里我需要兑现上面相当大一部分诺言。大地上慢慢响起时间魔法咒语的迎唱声,我看向深邃的星空,繁星开始律动,洒下无数的星辉,时间的五彩光辉在时空尽头盘旋,横梗古今 —— 那就是我的魔法啊!

class LocalDateTime
    {

    private:
        TimeScale *year;

        TimeScale *month;

        TimeScale *day;

        TimeScale *hour;

        TimeScale *minute;

        TimeScale *second;

        TimeScale *milliSecond;

    public:
        LocalDateTime();

        LocalDateTime(long milliSecond);

        LocalDateTime(int year, int month, int day);

        LocalDateTime(int year, int month, int day, int hour, int minute, int second);

        LocalDateTime(int year, int month, int day, int hour, int minute, int second, int milliSecond);

        LocalDateTime(LocalDateTime &source);

        TimeScale *getYear();

        TimeScale *getMonth();

        TimeScale *getDay();

        TimeScale *getHour();

        TimeScale *getMinute();

        TimeScale *getSecond();

        TimeScale *getMilliSecond();

        bool operator<(LocalDateTime &other);

        bool operator>(LocalDateTime &other);

        bool operator<=(LocalDateTime &other);

        bool operator>=(LocalDateTime &other);

        bool operator==(LocalDateTime &other);

        bool operator!=(LocalDateTime &other);

        ~LocalDateTime();
    };

在时间魔法中,LocalDateTime是由Year,Month,Day等咒语组成的。通过LocalDateTime的每个时间刻度部分,我们可以对整个LocalDateTime的时间进行增减运算。同时,为了支持LocalDateTime的时间判断能力,我也对TimeScale的能力进行的扩充,增加了逻辑判断运算符的重载:

bool operator<(const TimeScale &other);

bool operator>(const TimeScale &other);

bool operator<=(const TimeScale &other);

bool operator>=(const TimeScale &other);

bool operator==(const TimeScale &other);

bool operator!=(const TimeScale &other);

这样我们可以借助对时间刻度的逻辑判断实现时间魔法的逻辑判断,以大小判断为例:

bool datetime::LocalDateTime::operator<(datetime::LocalDateTime &other)
{
    bool result = (*year)< (*(other.year));
    if (!result)
    {
        result = (*month)< (*(other.month));

        if (!result)
        {
            result = (*day)< (*(other.day));

            if (!result)
            {
                result = (*hour)< (*(other.hour));

                if (!result)
                {
                    result = (*minute)< (*(other.minute));

                    if (!result)
                    {
                        result = (*second)< (*(other.second));

                        if (!result)
                        {
                            result = (*milliSecond)< (*(other.milliSecond));
                        }
                    }
                }
            }
        }
    }

    return result;
}

同时提供了多个重载的构造方法,实现了获取本地时间,通过日期或者通过具体时间构建时间的方法:

LocalDateTime();

LocalDateTime(long milliSecond);

LocalDateTime(int year, int month, int day);

LocalDateTime(int year, int month, int day, int hour, int minute, int second);

LocalDateTime(int year, int month, int day, int hour, int minute, int second, int milliSecond);

LocalDateTime(LocalDateTime &source);

其中还是以默认构造函数为例:

datetime::LocalDateTime::LocalDateTime()
{
    long _milliseconds = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count();
    _milliseconds += datetime::timezoneOffset() * 3600000;
    int _year;
    int _month;
    int _day;
    int _hour;
    int _minute;
    int _second;
    int _millisecond;

    datetime::getGregorianDateTime(_milliseconds, _year, _month, _day, _hour, _minute, _second, _millisecond);
    new (this) LocalDateTime(_year, _month, _day, _hour, _minute, _second, _millisecond);
}

此外了为了方便调试,我还提供了全局的输出操作重载,打印输出时间值。当然这里有一点比较重要就是,不要把输出重载操作定义在命名空间内,不然你有可能找不到定义。

std::ostream &operator<<(std::ostream &out, datetime::LocalDateTime &localDateTime);

所以是时候,亮出我们真正的时间魔法了:

datetime::LocalDateTime::LocalDateTime()
{
    long _milliseconds = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count();
    _milliseconds += datetime::timezoneOffset() * 3600000;
    int _year;
    int _month;
    int _day;
    int _hour;
    int _minute;
    int _second;
    int _millisecond;

    datetime::getGregorianDateTime(_milliseconds, _year, _month, _day, _hour, _minute, _second, _millisecond);
    new (this) LocalDateTime(_year, _month, _day, _hour, _minute, _second, _millisecond);
}

datetime::LocalDateTime::LocalDateTime(long milliSecond)
{
    int _year;
    int _month;
    int _day;
    int _hour;
    int _minute;
    int _second;
    int _millisecond;

    datetime::getGregorianDateTime(milliSecond, _year, _month, _day, _hour, _minute, _second, _millisecond);
    new (this) LocalDateTime(_year, _month, _day, _hour, _minute, _second, _millisecond);
}

datetime::LocalDateTime::LocalDateTime(int year, int month, int day) : LocalDateTime(year, month, day, 0, 0, 0, 0) {}

datetime::LocalDateTime::LocalDateTime(int year, int month, int day, int hour, int minute, int second) : LocalDateTime(year, month, day, hour, minute, second, 0) {}

datetime::LocalDateTime::LocalDateTime(int year, int month, int day, int hour, int minute, int second, int milliSecond)
{
    int daysInMonths[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (datetime::isLeapYear(year))
    {
        daysInMonths[1] = 29;
    }

    this->year = new datetime::Year{year};
    this->month = new datetime::Month{this->year, month};
    this->year->setChild(this->month);
    this->day = new datetime::Day{this->month, day, daysInMonths[month - 1]};
    this->month->setChild(this->day);
    this->hour = new datetime::TimeScale{this->day, hour, 24};
    this->day->setChild(this->hour);
    this->minute = new datetime::TimeScale{this->hour, minute, 60};
    this->hour->setChild(this->minute);
    this->second = new datetime::TimeScale{this->minute, second, 60};
    this->minute->setChild(this->second);
    this->milliSecond = new datetime::TimeScale{this->second, milliSecond, 1000};
    this->second->setChild(this->milliSecond);
}

datetime::LocalDateTime::LocalDateTime(LocalDateTime &source)
{
    int _year = *(source.year);
    int _month = *(source.month);
    int _day = *(source.day);
    int _hour = *(source.hour);
    int _minute = *(source.minute);
    int _second = *(source.second);
    int _millisecond = *(source.milliSecond);

    new (this) LocalDateTime(_year, _month, _day, _hour, _minute, _second, _millisecond);
}

datetime::TimeScale *datetime::LocalDateTime::getYear()
{
    return year;
}

datetime::TimeScale *datetime::LocalDateTime::getMonth()
{
    return month;
}

datetime::TimeScale *datetime::LocalDateTime::getDay()
{
    return day;
}

datetime::TimeScale *datetime::LocalDateTime::getHour()
{
    return hour;
}

datetime::TimeScale *datetime::LocalDateTime::getMinute()
{
    return minute;
}

datetime::TimeScale *datetime::LocalDateTime::getSecond()
{
    return second;
}

datetime::TimeScale *datetime::LocalDateTime::getMilliSecond()
{
    return milliSecond;
}

bool datetime::LocalDateTime::operator<(datetime::LocalDateTime &other)
{
    bool result = (*year)< (*(other.year));
    if (!result)
    {
        result = (*month)< (*(other.month));

        if (!result)
        {
            result = (*day)< (*(other.day));

            if (!result)
            {
                result = (*hour)< (*(other.hour));

                if (!result)
                {
                    result = (*minute)< (*(other.minute));

                    if (!result)
                    {
                        result = (*second)< (*(other.second));

                        if (!result)
                        {
                            result = (*milliSecond)< (*(other.milliSecond));
                        }
                    }
                }
            }
        }
    }

    return result;
}

bool datetime::LocalDateTime::operator>(datetime::LocalDateTime &other)
{
    bool result = (*year) >(*(other.year));
    if (!result)
    {
        result = (*month) >(*(other.month));

        if (!result)
        {
            result = (*day) >(*(other.day));

            if (!result)
            {
                result = (*hour) >(*(other.hour));

                if (!result)
                {
                    result = (*minute) >(*(other.minute));

                    if (!result)
                    {
                        result = (*second) >(*(other.second));

                        if (!result)
                        {
                            result = (*milliSecond) >(*(other.milliSecond));
                        }
                    }
                }
            }
        }
    }

    return result;
}

bool datetime::LocalDateTime::operator==(datetime::LocalDateTime &other)
{
    return (*year) == (*(other.year)) && (*month) == (*(other.month)) && (*day) == (*(other.day)) && (*hour) == (*(other.hour)) && (*minute) == (*(other.minute)) && (*second) == (*(other.second)) && (*milliSecond) == (*(other.milliSecond));
}

bool datetime::LocalDateTime::operator<=(datetime::LocalDateTime &other)
{
    return !this->operator>(other);
}

bool datetime::LocalDateTime::operator>=(datetime::LocalDateTime &other)
{
    return !this->operator<(other);
}

bool datetime::LocalDateTime::operator!=(datetime::LocalDateTime &other)
{
    return !this->operator==(other);
}

datetime::LocalDateTime::~LocalDateTime()
{
    delete year;
    delete month;
    delete day;
    delete hour;
    delete minute;
    delete second;
    delete milliSecond;
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


新闻标题:小白C++入坑学废之旅(八)-创新互联
本文路径:http://scyanting.com/article/ddepjh.html