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);
}

转载于:https://www.cnblogs.com/shenchao/p/3211825.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值