写了一个时间处理的类,能将人类时间转换成距离公元零年一月一日秒数(时间戳),同时支持时间戳转换成日期时间

  1 #include "stdafx.h"
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <time.h>
  5
  6 #define IS_LEAP_YEAR(y)  (((y) % 4 == 0 && (y) % 100 != 0) || (y) % 400 == 0)
  7
  8 #define if_not_eual_ret(left, right) do {  9     if (left < right) {return true;} else if(left > right) {return false;} 10     } while(0)
 11
 12 //从网上抄的 计算日期相差天数的函数
 13 int day_diff(int year_start, int month_start, int day_start,
 14     int year_end, int month_end, int day_end)
 15 {
 16     int y2, m2, d2;
 17     int y1, m1, d1;
 18
 19     m1 = (month_start + 9) % 12;
 20     y1 = year_start - m1/10;
 21     d1 = 365*y1 + y1/4 - y1/100 + y1/400 + (m1*306 + 5)/10 + (day_start - 1);
 22
 23     m2 = (month_end + 9) % 12;
 24     y2 = year_end - m2/10;
 25     d2 = 365*y2 + y2/4 - y2/100 + y2/400 + (m2*306 + 5)/10 + (day_end - 1);
 26
 27     return (d2 - d1);
 28 }
 29
 30
 31 class CMyDateTime
 32 {
 33 public:
 34     CMyDateTime(int sec_from_beg = 0)
 35     {
 36         m_sec_from_beg = sec_from_beg;
 37     }
 38
 39     CMyDateTime(int year, int month, int day, int hour, int minute, int second)
 40     {
 41         m_sec_from_beg = to_second(year, month, day, hour, minute, second);
 42     }
 43
 44     bool operator < (const CMyDateTime& theDate)
 45     {
 46         return m_sec_from_beg < theDate.m_sec_from_beg;
 47     }
 48
 49     //获得0001 01:01:00至当前时间秒数
 50     long long to_second()
 51     {
 52         return m_sec_from_beg;
 53     }
 54
 55
 56     //年 取1900-3000 月 取0-11 日 取1-31 时分秒 取0-59
 57     static long long to_second(int year, int month, int day, int hour, int minute, int second)
 58     {
 59         //获取当前日期至纪元1年的天数
 60         int y1 = year, m1 = 0, d1 = day - 1;
 61         long long sec;
 62
 63         //每月天数
 64         int month_day[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 65
 66         if (IS_LEAP_YEAR(year))
 67         {
 68             month_day[1]++;
 69         }
 70         for (int i = 0; i < month; i++)
 71         {
 72             m1 += month_day[i];
 73         }
 74
 75         y1 -= 1;
 76         d1 = 365*y1 + y1/4 - y1/100 + y1/400 + m1 + d1;
 77
 78         //24小时 60分 60秒
 79         sec = (long long)d1 * (24 * 60 * 60);
 80         sec += hour * 3600 + minute * 60 + second;
 81         return sec;
 82     }
 83
 84     //把秒数转换成标准日期
 85     bool to_date(int& year, int& month, int& day, int& hour, int& minute, int& second)
 86     {
 87         // 先计算大概年份,用秒数除以366天秒数
 88         int day_from_beg = (int)(m_sec_from_beg / (24 * 60 * 60));
 89
 90         int second_left = int(m_sec_from_beg - day_from_beg * (long long) (24 * 60 * 60));
 91         hour = second_left / (60 * 60);
 92
 93         second_left = int (second_left - hour * (60 * 60));
 94         minute = second_left / 60;
 95         second = second_left % 60;
 96
 97         int year_cnt = day_from_beg / 366;
 98         //每年365天 闰年多一天
 99         int day_from_beg_to_year = (year_cnt * 365 + year_cnt / 4 - year_cnt / 100 + year_cnt / 400);
100
101         //然后逐年累加天数,直到天数大于day_from_beg
102         while (day_from_beg_to_year <= day_from_beg)
103         {
104             if (IS_LEAP_YEAR(year_cnt + 1))
105             {
106                 day_from_beg_to_year += 366;
107             }
108             else
109             {
110                 day_from_beg_to_year += 365;
111             }
112             year_cnt++;
113         }
114         //因为是要取最后一个小于等于在数 所以在这里要减一
115         year_cnt--;
116
117         //知道年份后,再计算月份 先计算出当前日期距离今年开始相差多少天
118         int day_from_year = day_from_beg - (year_cnt * 365 + year_cnt / 4 - year_cnt / 100 + year_cnt / 400);
119         //今年的年数 = 经过的年数 + 1
120         year = year_cnt + 1;
121
122         //每月天数
123         int month_day[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
124
125         if (IS_LEAP_YEAR(year))
126         {
127             month_day[1]++;
128         }
129
130         for (month = 0; month < 12; month++)
131         {
132             if ((day_from_year - month_day[month]) < 0)
133             {
134                 break;
135             }
136
137             day_from_year -= month_day[month];
138         }
139         day = day_from_year + 1;
140         return true;
141     }
142 private:
143     //当前日期至纪元1年的秒数
144     long long m_sec_from_beg;
145 };
146
147 //测试函数,测试每一秒钟从人类日期格式转换成CMyDateTime 再转换回来是否正确
148 void test_time()
149 {
150     int month_day[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
151
152     for (int year = 1; year < 2100; year++)
153     {
154         double start = GetTickCount();
155         bool is_leap = IS_LEAP_YEAR(year);
156         if (is_leap)
157         {
158             month_day[1] = 29;
159         }
160
161         for (int month = 0; month < 12; month++)
162         {
163             for (int day = 1; day <= month_day[month]; day++)
164             {
165                 for (int hour = 0; hour < 24; hour++)
166                 {
167                     for (int minute = 0; minute < 60; minute++)
168                     {
169                         for (int second = 0; second < 60; second++)
170                         {
171                             CMyDateTime t(year, month, day, hour, minute, second);
172                             int year_new, month_new, day_new, hour_new, minute_new, second_new;
173                             if (t.to_date(year_new, month_new, day_new, hour_new, minute_new, second_new))
174                             {
175                                 if (year != year_new || month != month_new || day_new != day ||
176                                     hour != hour_new || minute != minute_new || second != second_new)
177                                 {
178                                     printf("day = %d day_new = %d\n", day, day_new);
179                                     printf("month = %d month_new = %d\n", month, month_new);
180                                     printf("year = %d year_new = %d\n", year, year_new);
181
182
183                                     printf("hour = %d hour_new = %d\n", hour, hour_new);
184                                     printf("minute = %d minute_new = %d\n", minute, minute_new);
185                                     printf("second = %d second_new = %d\n", second, second_new);
186                                     printf("------------------------\n");
187                                 }
188                             }
189                         }
190                     }
191                 }
192             }
193         }
194
195         if (is_leap)
196         {
197             month_day[1] = 28;
198         }
199
200         //我的机器一年花5秒左右 效率不是特别高 但目前没有优化头绪
201         printf("总共耗时 %f 毫秒\n", GetTickCount() - start);
202         printf("------------[%04d]------------\n", year);
203     }
204 }
时间: 2024-11-10 00:14:15

写了一个时间处理的类,能将人类时间转换成距离公元零年一月一日秒数(时间戳),同时支持时间戳转换成日期时间的相关文章

PHP获取当前时间、时间戳的各种格式写法汇总[日期时间]

原文:PHP获取当前时间.时间戳的各种格式写法汇总[日期时间] 今天写下php中,如何通过各种方法 获取当前系统时间.时间戳,并备注各种格式的含义,可灵活变通. 1.获取当前时间方法date() 很简单,这就是获取时间的方法,格式为:date($format, $timestamp),format为格式.timestamp为时间戳--可填参数. 2.获取时间戳方法time().strtotime() 这两个方法,都可以获取php中unix时间戳,time()为直接获取得到,strtotime($

自己用反射写的一个request.getParameter工具类

适用范围:当我们在jsp页面需要接收很多值的时候,如果用request.getParameter(属性名)一个一个写的话那就太麻烦了,于是我想是 否能用反射写个工具类来简化这样的代码,经过1个小时的代码修改调试,终于雏形出来了,很高兴调试成功,呵呵,代码贴出来. package com.letv.uts2.utcServer.util; import org.slf4j.Logger;import org.slf4j.LoggerFactory; import java.lang.reflect

自己写的一个分页控件类(WinForm)

using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; namespace xYuanShian.ControlLibrary { /// <summary> /// 翻页控件 /// </summary> pu

自己写的一个表单验证类

表单验证类使用说明: myvalidation类的使用说明: 目前实现功能:form表单的非空验证和手机号码验证 默认弹出提示框,提示框的内容 优先选择:input对应lable文本+"不能为空" 其次选择:input的placeholder字段 因此至少保证,上述至少有一种是想要的警告内容 使用方法: 1,jsp页面中引入myvalidation.js文件 2,删除一切jsp页面原提交按钮的onclick="xxx.submit();事件 3,form表单字段非空:对应字段

DELPHI日期时间函数(DateUtils单元)

原文出自:http://shao171.blog.163.com/blog/static/238397019201502011844293/ CompareDate 函数 比较两个日期时间值日期部分的大小 CompareDateTime 函数 比较两个日期时间值的大小 CompareTime 函数 比较两个日期时间值时间部分的大小 DateOf 函数 去除日期时间值的时间部分 DateTimeToJulianDate 函数 转换日期时间值为儒略日 DateTimeToModifiedJulian

类的继承与super()的意义以即如何写一个正确的异常类

这些东西都是我看了许多名师课程和自己研究的成果,严禁转载,这里指出了如何正确的自己定义一个异常类并看一看sun写的java的源代码话题一:子类的构造器执行是否一定会伴随着父类的构造执行? 1.this()与super()不能共存2.如果不显示地调用this()和super();子类对象的创建是否一定执行父类的构造3.既然super()和this()不能共存,又说子类的构造执行一定会执行父类的构造,那么我让子类的构造执行this()是不是就不能在执行父类的构造? 4.如果我非不让父类的构造执行,我

写了一个DELPHI操作USB摄像头类分享给大家

最近在使用Usb摄像头做了个项目,其中写了一个操作usb摄像头类分享给大家 {*******************************************************} { } { 操作USB摄像头类 } { } { 作者:lqen } { 日期:2015.05.18 } { } {*******************************************************} unit untUsbCamera; interface uses Window

java时间比较工具类分享

开发中经常需要比较时间,写了一个简易的工具类,分享一下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

Android 分享一个SharedPreferences的工具类,方便保存数据

我们平常保存一些数据,都会用到SharedPreferences,他是保存在手机里面的,具体路径是data/data/你的包名/shared_prefs/保存的文件名.xml, SharedPreferences的使用也很简单,我自己就写了一个SharedPreferences的工具类,然后就保存在这里,等自己以后需要保存数据直接从这里copy代码,哈哈 工具类如下 [java] view plaincopy package com.example.shortcut; import androi