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;
    }
  • 相关阅读:
    一起学习Avalonia(九)
    一起学习Avalonia(八)
    一起学习Avalonia(七)
    【JAVA习题二十八】海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
    【JAVA习题二十七】有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下
    【JAVA习题二十六】输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
    【JAVA习题二十五】打印出杨辉三角形
    【JAVA习题二十四】有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
    【JAVA习题二十三】求一个3*3矩阵对角线元素之和
    【JAVA习题二十二】求100之内的素数
  • 原文地址:https://www.cnblogs.com/wjshan0808/p/4783527.html
Copyright © 2011-2022 走看看