-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathms_time.c
134 lines (113 loc) · 3.17 KB
/
ms_time.c
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include "ms_time.h"
static void ms_time_gmtime(const time_t t, struct tm *tp);
/***********************************************************
* @Func : ms_time_sec()
* @Author : lwp
* @Brief : 获取秒时间戳。
* @Param : [in] NONE
* @Return : NONE
* @Note :
***********************************************************/
uintptr_t ms_time_sec(void)
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec;
}
// @ms_time_sec() ok
/***********************************************************
* @Func : ms_time_ms()
* @Author : lwp
* @Brief : 获取毫秒时间戳。
* @Param : [in] NONE
* @Return : NONE
* @Note :
***********************************************************/
uintptr_t ms_time_ms(void)
{
struct timeval tv;
gettimeofday(&tv, NULL);
return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
}
// @ms_time_ms() ok
/***********************************************************
* @Func : ms_time_stamp()
* @Author : lwp
* @Brief : 获取当前时间戳。
* @Param : [in] buff : buff 的起始地址
* @Param : [in] last : buff 的结束地址
* @Return : buff 写入数据后的地址
* @Note :
***********************************************************/
char *ms_time_stamp(char *buff, const char *last)
{
char *p = NULL;
time_t sec;
struct tm gmt;
struct timeval tv;
gettimeofday(&tv, NULL);
sec = tv.tv_sec; // 秒
ms_time_gmtime(sec, &gmt);
p = ms_str_slprintf(buff, last, TIME_STAMP_FORMAT,
gmt.tm_year, gmt.tm_mon, gmt.tm_mday,
gmt.tm_hour, gmt.tm_min, gmt.tm_sec, tv.tv_usec);
return p;
}
// @ms_time_stamp() ok
/***********************************************************
* @Func : ms_time_gmtime()
* @Author : lwp
* @Brief : 时间格式转换。
* @Param : [in] t : time_t 格式的秒数
* @Param : [in] tp : struct tm 格式的时间
* @Return : NONE
* @Note :
***********************************************************/
static void ms_time_gmtime(const time_t t, struct tm *tp)
{
intptr_t yday;
uintptr_t days, leap, n, year, mon, mday, hour, min, sec;
n = t;
// 总天数
days = n / 86400;
// days 天 + n 秒
n %= 86400;
// days 天 + hour 小时
hour = n / 3600;
// days 天 + hour 小时 + n 秒
n %= 3600;
// days 天 + hour 小时 + min 分钟
min = n / 60;
// days 天 + hour 小时 + min 分钟 + sec 秒
sec = n % 60;
// the algorithm based on Gauss' formula
days = days - (31 + 28) + 719527;
year = (days + 2) * 400 / (365 * 400 + 100 - 4 + 1);
yday = days - (365 * year + year / 4 - year / 100 + year / 400);
if (yday < 0)
{
// 闰年
leap = (year % 4 == 0) && (year % 100 || (year % 400 == 0));
yday = 365 + leap + yday;
year--;
}
mon = (yday + 31) * 10 / 306;
mday = yday - (367 * mon / 12 - 30) + 1;
if (yday >= 306)
{
year++;
mon -= 10;
}
else
{
mon += 2;
}
// end algorithm of Gauss' formula
tp->tm_year = year;
tp->tm_mon = mon;
tp->tm_mday = mday;
tp->tm_hour = hour + 8;
tp->tm_min = min;
tp->tm_sec = sec;
}
// @ms_time_gmtime() ok