• C++方式解析时间字符串和计算时间


    #include "StdAfx.h"
    #include "MySetTimeByVT.h"

    #include <ATLComTime.h>
    #include <OleAuto.h>                //VariantTimeToSystemTime()
    #include <comutil.h>                //_variant_t
    #include <iostream>
    using namespace std;


    MySetTimeByVT::MySetTimeByVT(void)
    {
        GetLocalTime(&m_systime);  
    }


    MySetTimeByVT::~MySetTimeByVT(void)
    {
    }

    MySetTimeByVT::MySetTimeByVT(SYSTEMTIME sysTime)
    {
        m_systime = sysTime;
    }

    MySetTimeByVT::MySetTimeByVT(const MySetTimeByVT &time)
    {
        this->m_systime = time.m_systime;
    }

    MySetTimeByVT::MySetTimeByVT(const char *string)
    {
        Parse(string);
    }

    SYSTEMTIME MySetTimeByVT::GetTime()
    {
        return m_systime;
    }

    void MySetTimeByVT::Parse(const char* timeString)
    {
        std::string str_Time = timeString;
        Parse(str_Time);
    }

    std::string MySetTimeByVT::ToString(const char* format)
    {
        string str_Format(format);
        return ToString(str_Format);
    }


    void MySetTimeByVT::AddYears(int year)
    {
        m_milliseconds = m_systime.wMilliseconds;

        m_systime.wYear += year;

        _variant_t v_time;
        SystemTimeToVariantTime(&m_systime,&v_time.date);
        VariantTimeToSystemTime(v_time.date,&m_systime);

        m_systime.wMilliseconds = m_milliseconds;
    }

    void MySetTimeByVT::AddMonths(int month)
    {
        m_milliseconds = m_systime.wMilliseconds;

        m_systime.wMonth += month;

        _variant_t v_time;
        SystemTimeToVariantTime(&m_systime,&v_time.date);
        VariantTimeToSystemTime(v_time.date,&m_systime);

        m_systime.wMilliseconds = m_milliseconds;
    }

    void MySetTimeByVT::AddDays(int day)
    {
        m_milliseconds = m_systime.wMilliseconds;

        m_systime.wDay += day;

        _variant_t v_time;
        SystemTimeToVariantTime(&m_systime,&v_time.date);
        VariantTimeToSystemTime(v_time.date,&m_systime);

        m_systime.wMilliseconds = m_milliseconds;
    }

    void MySetTimeByVT::AddHours(int hour)
    {
        m_milliseconds = m_systime.wMilliseconds;

        m_systime.wHour += hour;

        _variant_t v_time;
        SystemTimeToVariantTime(&m_systime,&v_time.date);
        VariantTimeToSystemTime(v_time.date,&m_systime);

        m_systime.wMilliseconds = m_milliseconds;
    }

    void MySetTimeByVT::AddMinutes(int minute)
    {
        m_milliseconds = m_systime.wMilliseconds;

        m_systime.wMinute += minute;

        _variant_t v_time;
        SystemTimeToVariantTime(&m_systime,&v_time.date);
        VariantTimeToSystemTime(v_time.date,&m_systime);

        m_systime.wMilliseconds = m_milliseconds;
    }

    void MySetTimeByVT::AddSeconds(int seconds)
    {
        m_milliseconds = m_systime.wMilliseconds;

        m_systime.wSecond += seconds;

        _variant_t v_time;
        SystemTimeToVariantTime(&m_systime,&v_time.date);
        VariantTimeToSystemTime(v_time.date,&m_systime);

        m_systime.wMilliseconds = m_milliseconds;
    }

    void MySetTimeByVT::AddMilliseconds(int milliseconds)
    {
        int nowmilliseconds = m_systime.wMilliseconds + milliseconds;
        m_systime.wMilliseconds = nowmilliseconds % 1000;

        int addSeconds = nowmilliseconds / 1000;
        AddSeconds(addSeconds);
    }


    void MySetTimeByVT::Parse(std::string& timeString)
    {    
        if (timeString.empty())
        {
            cout<<"输入的字符串不能为空!"<<endl;
            return;
        }
        
        static const basic_string <char>::size_type npos = -1;

        try
        {
        int search_e = timeString.length();
        int search_s = search_e;
        int search_n = search_s;

        //////////////////////////////////////////////////////////////////////////
        //年-月-日 时:分:秒.毫秒
        //////////////////////////////////////////////////////////////////////////
        //时     时:分        时:分:秒        .毫秒     秒.毫秒        分:秒.毫秒        时:分:秒.毫秒        
        //取毫秒
        search_s = timeString.rfind('.');
        if (search_s != npos)
        {
            m_systime.wMilliseconds = stoi(timeString.substr(search_s + 1,search_e));
        
            search_e = search_s;

            search_n = timeString.rfind(' ',search_e - 1);
            if (search_n != npos)
            {
                search_s = timeString.rfind(':',search_e - 1);
                if (search_s != npos)
                {
                    //取秒
                    m_systime.wSecond = stoi(timeString.substr(search_s + 1,search_e));
                    search_e = search_s;
                    //取分、时
                    search_s = timeString.rfind(':',search_e - 1);
                    if (search_s != npos)
                    {
                        //取分
                        m_systime.wMinute = stoi(timeString.substr(search_s + 1,search_e));
                        search_e = search_s;
                        //取时
                        if (search_n + 1 < search_e)
                        {
                            m_systime.wHour = stoi(timeString.substr(search_n + 1,search_e));
                        }
                        else
                        {
                            m_systime.wHour = 0;
                        }
                        search_e = search_n;
                    }
                    else
                    {
                        //取分

                        m_systime.wMinute = stoi(timeString.substr(search_n + 1,search_e));
                        search_e = search_n;
                        m_systime.wHour = 0;
                    }
                }
                else                        //取秒(秒.毫秒)
                {
                    m_systime.wHour = 0;
                    m_systime.wMinute = 0;
                    if (search_n + 1 < search_e)
                    {
                        m_systime.wSecond = stoi(timeString.substr(search_n + 1,search_e));
                    }
                    else
                    {
                        m_systime.wSecond = 0;
                    }
                    search_e = search_n;
                }
            }
            else
            {
                m_systime.wHour = 0;
                m_systime.wMinute = 0;
                m_systime.wSecond = stoi(timeString.substr(0,search_e));
                search_e = 0;
            }
            
        }
        else
        {
            m_systime.wMilliseconds = 0;

            //取时、分、秒
            search_s = timeString.rfind(' ',search_e - 1);
            if (search_s != npos)
            {
                //取时、分、秒
                search_n = timeString.find(':',search_s + 1);
                if (search_n != npos)
                {
                    m_systime.wHour = stoi(timeString.substr(search_s + 1,search_n));
                    search_s = search_n;
                    //取分、秒
                    search_n = timeString.find(':',search_s + 1);
                    if (search_n != npos)
                    {
                        m_systime.wMinute = stoi(timeString.substr(search_s + 1,search_n));
                        //取秒
                        m_systime.wSecond = stoi(timeString.substr(search_n + 1,search_e));
                    }
                    else
                    {
                        if (search_s + 1 < search_e)
                        {
                            m_systime.wMinute = stoi(timeString.substr(search_s + 1,search_e));
                        }
                        else
                        {
                            m_systime.wMinute = 0;
                        }
                        m_systime.wSecond = 0;
                    }
                    
                    search_n = timeString.rfind(' ',search_e - 1);
                    search_e = search_n;
                }
                else
                {
                    m_systime.wHour = stoi(timeString.substr(search_s + 1,search_e));
                    m_systime.wMinute = 0;
                    m_systime.wSecond = 0;
                    search_e = search_s;
                }
            }
            else
            {
                m_systime.wHour = 0;
                m_systime.wMinute = 0;
                m_systime.wSecond = 0;
            }

        }

        //////////////////////////////////////////////////////////////////////////
        //天        月-天        年-月-天
        //取天
        search_s = timeString.rfind('-',search_e - 1);
        if (search_s != npos)
        {
            m_systime.wDay = stoi(timeString.substr(search_s + 1,search_e));
            search_e = search_s;
            //取月
            search_s = timeString.rfind('-',search_e - 1);
            if (search_s != npos)
            {
                m_systime.wMonth = stoi(timeString.substr(search_s + 1,search_e));
                search_e = search_s;
                //取年
                search_s = 0;
                m_systime.wYear = stoi(timeString.substr(search_s,search_e));
                search_e = search_s;
            }
            else
            {
                search_s = 0;
                if (search_s < search_e)
                {
                    m_systime.wMonth = stoi(timeString.substr(search_s,search_e));
                }
                else
                {
                    m_systime.wMonth = 0;
                }
                search_e = search_s;
                m_systime.wYear = 0;
            }
        }
        else
        {
            search_s = 0;
            if (search_s < search_e)
            {
                m_systime.wDay = stoi(timeString.substr(search_s,search_e));
            }
            else
            {
                m_systime.wDay = 0;
            }
            search_e = search_s;
            m_systime.wMonth = 0;
            m_systime.wYear = 0;
        }
        
        //////////////////////////////////////////////////////////////////////////

        }
        catch(...)
        {
            cout<<"输入字符串有问题!"<<endl;
        }
        m_milliseconds = m_systime.wMilliseconds;

        //////////////////////////////////////////////////////////////////////////
        //存在的问题 超过标准数值的值 并未被自动转换为标准值
        _variant_t v_time;
        SystemTimeToVariantTime(&m_systime,&v_time.date);
        VariantTimeToSystemTime(v_time.date,&m_systime);
        
        //转换为标准值
        time_t m_time_t = SystemTimeToTime_t(m_systime);
        m_systime = Time_tToSystemTime(m_time_t);

        m_systime.wMilliseconds = m_milliseconds;
    }
    std::string MySetTimeByVT::ToString(std::string format)
    {

        const int str_size = 128;
        char c_date[str_size] = {0};
        if (format.empty())
        {
            sprintf_s(c_date,str_size,"%04d-%02d-%02d %02d:%02d:%02d.%d",m_systime.wYear,m_systime.wMonth,
                            m_systime.wDay,m_systime.wHour,m_systime.wMinute,m_systime.wSecond,m_systime.wMilliseconds);
            return c_date;
        }

        static const basic_string <char>::size_type npos = -1;

        //日期
        if (format.find("-m") != npos || format.find("-M") != npos)
        {
            sprintf_s(c_date,str_size,"%04d-%02d",m_systime.wYear,m_systime.wMonth);
            if (format.find("-d") != npos || format.find("-D") != npos)
            {
                sprintf_s(c_date,str_size,"%s-%02d",c_date,m_systime.wDay);
            }
        }
        else if (format.find("m-") != npos || format.find("M-") != npos)
        {
            sprintf_s(c_date,str_size,"%02d-%02d",m_systime.wMonth,m_systime.wDay);
        }
        else if (format.find('y') != npos || format.find('Y') != npos)
        {
            sprintf_s(c_date,str_size,"%04d",m_systime.wYear);
        }
        else if ( format.find('M') != npos && format.find(":") == npos && format.find("-") == npos )
        {
            sprintf_s(c_date,str_size,"%02d",m_systime.wMonth);
        }
        else if (format.find('d') != npos || format.find('D') != npos)
        {
            sprintf_s(c_date,str_size,"%02d",m_systime.wDay);
        }

        //时间
        if (format.find(":m") != npos || format.find(":M") != npos)
        {
            sprintf_s(c_date,str_size,"%s %02d:%02d",c_date,m_systime.wHour,m_systime.wMinute);
            if (format.find("s.") != npos || format.find("S.") != npos)
            {
                sprintf_s(c_date,str_size,"%s:%02d.%d",c_date,m_systime.wSecond,m_systime.wMilliseconds);
            }
            else if (format.find(":s") != npos || format.find(":S") != npos)
            {
                sprintf_s(c_date,str_size,"%s:%02d",c_date,m_systime.wSecond);
            }
        }
        else if (format.find("m:") != npos || format.find("M:") != npos)
        {
            sprintf_s(c_date,str_size,"%s %02d:%02d",c_date,m_systime.wMinute,m_systime.wSecond);
            if (format.find("s.") != npos || format.find("S.") != npos)
            {
                sprintf_s(c_date,str_size,"%s.%d",c_date,m_systime.wMilliseconds);
            }
        }
        else if (format.find("s.") != npos || format.find("S.") != npos)
        {
            sprintf_s(c_date,str_size,"%s %02d.%d",c_date,m_systime.wSecond,m_systime.wMilliseconds);
        }
        else if (format.find('h') != npos || format.find('H') != npos)
        {
            sprintf_s(c_date,str_size,"%s %02d",c_date,m_systime.wHour);
        }
        else if (format.find('m') != npos && format.find("-") == npos &&  format.find(":") == npos )
        {
            sprintf_s(c_date,str_size,"%s %02d",c_date,m_systime.wMinute);
        }
        else if (format.find('s') != npos || format.find('S') != npos)
        {
            sprintf_s(c_date,str_size,"%s %02d",c_date,m_systime.wSecond);
        }
        else if (format.find('f') != npos || format.find('F') != npos)
        {
            sprintf_s(c_date,str_size,"%s %02d",c_date,m_systime.wMilliseconds);
        }
        return c_date;
    }

    SYSTEMTIME MySetTimeByVT::Time_tToSystemTime(time_t t)
    {
        //tm temptm = *localtime(&t);
        tm temptm;
        localtime_s(&temptm,&t);
        SYSTEMTIME st = {1900 + temptm.tm_year,

            1 + temptm.tm_mon,

            temptm.tm_wday,

            temptm.tm_mday,

            temptm.tm_hour,

            temptm.tm_min,

            temptm.tm_sec,

            0};

        return st;
    }


    time_t MySetTimeByVT::SystemTimeToTime_t( const SYSTEMTIME& st )
    {
        tm temptm = {st.wSecond,

            st.wMinute,

            st.wHour,

            st.wDay,

            st.wMonth - 1,

            st.wYear - 1900,

            st.wDayOfWeek,

            0,

            0};

        return mktime(&temptm);
    }

  • 相关阅读:
    C# 中使用反射的优缺点
    winfrom---Window 消息大全
    Entity Framework:三种开发模式实现数据访问
    asp.net Core 2.0 MVC为Controller或Action添加定制特性实现登录验证
    [十二省联考2019] 异或粽子 解题报告 (可持久化Trie+堆)
    [jzoj 3175] 数树数 解题报告 (树链剖分)
    [jzoj 5661] 药香沁鼻 解题报告 (DP+dfs序)
    [jzoj 5662] 尺树寸泓 解题报告 (线段树+中序遍历)
    [jzoj 5664] [GDOI2018Day1模拟4.6] 凫趋雀跃 解题报告(容斥原理)
    范德蒙恒等式学习笔记
  • 原文地址:https://www.cnblogs.com/shenchao/p/3211825.html
Copyright © 2020-2023  润新知