zoukankan      html  css  js  c++  java
  • C++ DateTime 结构

    OS:Win7 ,Tools:VS2015

    DateTime.h

    #pragma once
    
    struct DateTime
    {
    public:
        unsigned Year;     // years since 1900 
        unsigned short Month;     // months since January - [0, 11] 
        unsigned short Day;         // day of the month - [1, 31]
        unsigned short Hour;     // hours since midnight - [0, 23]
        unsigned short Minute;     // minutes after the hour - [0, 59]
        unsigned short Seconds;     // seconds after the minute - [0, 60] including leap second
        //unsigned short DayOfWeek;// days since Sunday - [0, 6]
        //unsigned short DayOfYear;// days since January 1 - [0, 365] 
    
    public:
        //ctor
        DateTime(unsigned y, unsigned short m, unsigned short d, unsigned short h, unsigned short mi, unsigned short s);
        DateTime();
    
    public:
        //Is LeapYear
        bool IsLeapYear();
        //Day Of Week
        const char* DayOfWeek();
        /*Day Of Year*/
        int DayOfYear();
    
    public:
        //Start Elapsed
        static void Start();
        //End Elapsed , return Secs
        static double End(); 
    
    private:
        const char* _WeekDay_CHS[7] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };//Week Of English
        const char* _WeekDay_ENG[7] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };//Week Of Chinese
    
    private:
        const int DaysOfMonth[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };//Days of Month
        //const int* _DaysOfMonth = new int[12]{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    
    private:
        //静态变量必须在外部初始化
        static long Elapsed;
         
    };
    View Code

    DateTime.cpp

    //localtime 函数
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <time.h> 
    
    #include "DateTime.h"
    //测试
    #include <iostream>
    
    //初始化静态变量
    long DateTime::Elapsed = NAN;//数据丢失警告忽略。
    
    DateTime::DateTime(unsigned  y, unsigned short m, unsigned short d, unsigned short h, unsigned short mi, unsigned short s)
    {
        Year = y;
        Month = m;
        Day = d;
        Hour = h;
        Minute = mi;
        Seconds = s;
    }
    
    DateTime::DateTime()
    {
        //结构值 为 1990年0月 起 0:星期日,1:星期一
        time_t dt;
        struct tm* now;
        time(&dt);
        now = localtime(&dt);
    
        /*    出错误
        time_t dt;
        struct tm* now = { 0 };
        localtime_s(now, &dt);
        */
        Year = now->tm_year + 1900;
        Month = now->tm_mon + 1;
        Day = now->tm_mday;
        Hour = now->tm_hour;
        Minute = now->tm_min;
        Seconds = now->tm_sec;
    }
    
    bool DateTime::IsLeapYear()
    {
        return ((Year % 4 == 0 && Year % 100 != 0) || (Year % 400 == 0));
    }
    
    int DateTime::DayOfYear()
    {
        int tmp = 0;
        //取数组长度
        int len = (sizeof(DaysOfMonth) / sizeof(DaysOfMonth[0]));
        //测试
        //std::cout << len << std::endl;
        for (int i = 0; i < Month - 1; i++)
        {
            tmp += DaysOfMonth[i];
        }
        if (IsLeapYear())
            tmp++;
        return tmp + Day;
    }
    
    const char* DateTime::DayOfWeek()
    {
        /*//方法一:蔡勒公式,公式中的除法取整数。
    
            符号意义:  w:星期 eg:{0=星期日,1=星期一,...}
                        c:年数前两位 eg:{2015 c=20}
                        y:年数后两位 eg:{2015 y=15}
                        m:月 eg:{2015年2月28日 m=14,此时y=2014}  注意 1,2月要当成上一年的13,14月计算
                        d:日 eg:{28日 d=28}
            ① w=(y + y/4 + c/4 - 2*c + (26 * (m+1))/10 + d - 1) %7
          或② w=(c/4 - 2*c + y + y/4 + (13 * (m+1))/5 + d -1) %7
    
        unsigned  w, c, y, m, d;
        c = Year / 100;
        y = Year % 100;
        m = Month;
        if (Month == 1 || Month == 2)
        {
            y--;
            m += 12;
        }
        d = Day;
        w = (c / 4 - 2 * c + y + y / 4 + (13 * (m + 1)) / 5 + d - 1) % 7;
        return _WeekDay_CHS[w];
        */
    
        /*//方法二:基姆拉尔森公式,公式中的除法取整数
    
            符号意义:  w:星期 eg:{6=星期日,0=星期一,...}
                        y:年数 eg:{2015 y=2015}
                        m:月 eg:{2015年2月28日 m=14,此时y=2014}  注意 1,2月要当成上一年的13,14月计算
                        d:日 eg:{28日 d=28}
             w=(d + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) %7
    
        unsigned  w, y, m, d;
        y = Year;
        m = Month;
        if (Month == 1 || Month == 2)
        {
            y--;
            m += 12;
        }
        d = Day;
        w = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7 +1;
        //std::cout << w << std::endl;
        return _WeekDay_CHS[w];
        */
    
        /*//方法三:基数法,公式中的除法取整数
    
            1.年基数yb:
                平年=1,
                闰年=2。
            2.月基数mb:该月之前(不含该月)的每月天数的总和除以7取余
                平年={0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5},
                闰年={0, 3, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6}。
            3.符号意义:
                w:星期 eg:{0=星期日,1=星期一,...}
                y:年份 eg:{2015年3月4日 y=2015}
                yb:年基数 eg:{2015年3月4日 yb=1}
                mb:月基数 eg:{2015年3月4日 mb=3}
                d:日 eg:{2015年3月4日 d=4}
            w=(y + y/4 + y/400 - y/100 - yb + mb + d)%7
        */
        int NLY[12] = { 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5 };
        int    LY[12] = { 0, 3, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6 };
        unsigned y, yb, mb, d, w;
        if (IsLeapYear())
        {
            yb = 2;
            mb = LY[Month - 1];
        }
        else
        {
            yb = 1;
            mb = NLY[Month - 1];
        }
        y = Year;
        d = Day;
        w = (y + y / 4 + y / 400 - y / 100 - yb + mb + d) % 7;
        return _WeekDay_CHS[w];
    }
    
    void DateTime::Start()
    {
        Elapsed = clock();
    }
    
    double DateTime::End()
    {
        //测试
        /*long tmp = clock() - Elapsed;
        std::cout << tmp << std::endl;*/
        return static_cast<double>(clock() - Elapsed) / CLOCKS_PER_SEC;
    }
    View Code

    Main.cpp

    #include <iostream>
    #include "DateTime.h"
    
    using namespace std;
    
    
    int main()
    {
        DateTime::Start();
        //DateTime::Now();
        //DateTime dt2(1997, 3, 4, 22, 58, 31);
        DateTime dt2;
        cout << dt2.Year << "" << dt2.Month << "" << dt2.Day << "" << dt2.Hour << "" << dt2.Minute << "" << dt2.Seconds << "" << endl;
        cout << dt2.IsLeapYear() << endl;
        cout << dt2.DayOfYear() << endl;
        cout << dt2.DayOfWeek() << endl;
    
        cout << DateTime::End() << endl;
        getchar();
        return 0;
    }
  • 相关阅读:
    Android 主题theme说明 摘记
    Android开发 去掉标题栏方法 摘记
    安卓项目五子棋代码详解(二)
    关于 ake sure class name exists, is public, and has an empty constructor that is public
    百度地图3.0实现图文并茂的覆盖物
    android onSaveInstanceState()及其配对方法。
    关于集成科大讯飞语音识别的 一个问题总结
    android 关于 webview 控制其它view的显示 以及更改view数据失败的问题总结
    C# 解析 json Newtonsoft果然强大,代码写的真好
    c#数据类型 与sql的对应关系 以及 取值范围
  • 原文地址:https://www.cnblogs.com/wjshan0808/p/4783527.html
Copyright © 2011-2022 走看看