blob: 8a319c76fc17070b8f384ad6db2e82491ac0c0c1 [file] [log] [blame]
Igor Sysoevd59a0472003-11-10 21:09:22 +00001
2#include <ngx_config.h>
3#include <ngx_core.h>
4
5
Igor Sysoevf5003d82003-12-04 14:53:00 +00006time_t ngx_cached_time;
7ngx_epoch_msec_t ngx_elapsed_msec;
Igor Sysoev62260f22003-12-05 17:07:27 +00008ngx_epoch_msec_t ngx_old_elapsed_msec;
Igor Sysoevf5003d82003-12-04 14:53:00 +00009ngx_epoch_msec_t ngx_start_msec;
Igor Sysoevd59a0472003-11-10 21:09:22 +000010
Igor Sysoevf5003d82003-12-04 14:53:00 +000011ngx_tm_t ngx_cached_gmtime;
Igor Sysoev562e53e2003-11-13 06:14:05 +000012
Igor Sysoev62260f22003-12-05 17:07:27 +000013static char cached_err_log_time[] = "1970/09/28 12:00:00";
14ngx_str_t ngx_cached_err_log_time;
Igor Sysoev562e53e2003-11-13 06:14:05 +000015
Igor Sysoev62260f22003-12-05 17:07:27 +000016static char cached_http_time[] = "Mon, 28 Sep 1970 06:00:00 GMT";
17ngx_str_t ngx_cached_http_time;
Igor Sysoevd59a0472003-11-10 21:09:22 +000018
Igor Sysoev62260f22003-12-05 17:07:27 +000019static char cached_http_log_time[] = "28/Sep/1970:12:00:00";
20ngx_str_t ngx_cached_http_log_time;
Igor Sysoevd59a0472003-11-10 21:09:22 +000021
22
Igor Sysoev562e53e2003-11-13 06:14:05 +000023static char *week[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fir", "Sat" };
24static char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
25 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
26
27
Igor Sysoeva8fa0a62003-11-25 20:44:56 +000028void ngx_time_init()
Igor Sysoev562e53e2003-11-13 06:14:05 +000029{
30 struct timeval tv;
31
32 ngx_memzero(&ngx_cached_gmtime, sizeof(ngx_tm_t));
33#ifdef ngx_tm_zone
34 ngx_cached_gmtime.ngx_tm_zone = "GMT";
35#endif
36
37 ngx_cached_err_log_time.data = cached_err_log_time;
38 ngx_cached_http_time.data = cached_http_time;
39 ngx_cached_http_log_time.data = cached_http_log_time;
40
41 ngx_gettimeofday(&tv);
Igor Sysoev3c3ca172004-01-05 20:55:48 +000042 ngx_cached_time = 0;
Igor Sysoevf5003d82003-12-04 14:53:00 +000043 ngx_start_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000;
Igor Sysoev62260f22003-12-05 17:07:27 +000044 ngx_old_elapsed_msec = 0;
Igor Sysoevf5003d82003-12-04 14:53:00 +000045 ngx_elapsed_msec = 0;
46
Igor Sysoev3c3ca172004-01-05 20:55:48 +000047 ngx_time_update(tv.tv_sec);
Igor Sysoev562e53e2003-11-13 06:14:05 +000048}
49
50
Igor Sysoev3c3ca172004-01-05 20:55:48 +000051void ngx_time_update(time_t s)
Igor Sysoevd59a0472003-11-10 21:09:22 +000052{
Igor Sysoev562e53e2003-11-13 06:14:05 +000053 ngx_tm_t tm;
Igor Sysoevd59a0472003-11-10 21:09:22 +000054
Igor Sysoev3c3ca172004-01-05 20:55:48 +000055 if (ngx_cached_time == s) {
56 return;
57 }
58
59 ngx_cached_time = s;
60
Igor Sysoev562e53e2003-11-13 06:14:05 +000061 ngx_gmtime(ngx_cached_time, &ngx_cached_gmtime);
Igor Sysoevd59a0472003-11-10 21:09:22 +000062
Igor Sysoev562e53e2003-11-13 06:14:05 +000063 ngx_cached_http_time.len = ngx_snprintf(ngx_cached_http_time.data,
64 sizeof("Mon, 28 Sep 1970 06:00:00 GMT"),
65 "%s, %02d %s %4d %02d:%02d:%02d GMT",
66 week[ngx_cached_gmtime.ngx_tm_wday],
67 ngx_cached_gmtime.ngx_tm_mday,
68 months[ngx_cached_gmtime.ngx_tm_mon - 1],
69 ngx_cached_gmtime.ngx_tm_year,
70 ngx_cached_gmtime.ngx_tm_hour,
71 ngx_cached_gmtime.ngx_tm_min,
72 ngx_cached_gmtime.ngx_tm_sec);
Igor Sysoevd59a0472003-11-10 21:09:22 +000073
74 ngx_localtime(&tm);
75
Igor Sysoev562e53e2003-11-13 06:14:05 +000076 ngx_cached_err_log_time.len = ngx_snprintf(ngx_cached_err_log_time.data,
77 sizeof("1970/09/28 12:00:00"),
78 "%4d/%02d/%02d %02d:%02d:%02d",
79 tm.ngx_tm_year, tm.ngx_tm_mon,
80 tm.ngx_tm_mday, tm.ngx_tm_hour,
81 tm.ngx_tm_min, tm.ngx_tm_sec);
82
Igor Sysoevd59a0472003-11-10 21:09:22 +000083 ngx_cached_http_log_time.len = ngx_snprintf(ngx_cached_http_log_time.data,
84 sizeof("28/Sep/1970:12:00:00"),
85 "%02d/%s/%d:%02d:%02d:%02d",
86 tm.ngx_tm_mday,
87 months[tm.ngx_tm_mon - 1],
88 tm.ngx_tm_year,
89 tm.ngx_tm_hour,
90 tm.ngx_tm_min,
91 tm.ngx_tm_sec);
92}
Igor Sysoev562e53e2003-11-13 06:14:05 +000093
94
95size_t ngx_http_time(char *buf, time_t t)
96{
97 ngx_tm_t tm;
98
99 ngx_gmtime(t, &tm);
100
101 return ngx_snprintf(buf, sizeof("Mon, 28 Sep 1970 06:00:00 GMT"),
102 "%s, %02d %s %4d %02d:%02d:%02d GMT",
103 week[tm.ngx_tm_wday],
104 tm.ngx_tm_mday,
105 months[tm.ngx_tm_mon - 1],
106 tm.ngx_tm_year,
107 tm.ngx_tm_hour,
108 tm.ngx_tm_min,
109 tm.ngx_tm_sec);
110}
111
112
113void ngx_gmtime(time_t t, ngx_tm_t *tp)
114{
115 int sec, min, hour, mday, mon, year, wday, yday, days;
116
117 days = t / 86400;
118
119 /* Jaunary 1, 1970 was Thursday */
120 wday = (4 + days) % 7;
121
122 t %= 86400;
123 hour = t / 3600;
124 t %= 3600;
Igor Sysoev5f800782003-12-08 20:48:12 +0000125 min = t / 60;
Igor Sysoev562e53e2003-11-13 06:14:05 +0000126 sec = t % 60;
127
128 /* the algorithm based on Gauss's formula */
Igor Sysoev5f800782003-12-08 20:48:12 +0000129
Igor Sysoev562e53e2003-11-13 06:14:05 +0000130 days = days - (31 + 28) + 719527;
131
132 year = days * 400 / (365 * 400 + 100 - 4 + 1);
133 yday = days - (365 * year + year / 4 - year / 100 + year / 400);
134
135 mon = (yday + 31) * 12 / 367;
136 mday = yday - (mon * 367 / 12 - 31);
137
138 mon += 2;
139
140 if (yday >= 306) {
141 yday -= 306;
142 year++;
143 mon -= 12;
144
145 if (mday == 0) {
146 /* Jaunary 31 */
147 mon = 1;
148 mday = 31;
149
150 } else if (mon == 2) {
151
152 if ((year % 4 == 0) && (year % 100 || (year % 400 == 0))) {
153 if (mday > 29) {
154 mon = 3;
155 mday -= 29;
156 }
157
158 } else if (mday > 28) {
159 mon = 3;
160 mday -= 28;
161 }
162 }
163
164 } else {
165 yday += 31 + 28;
166
167 if ((year % 4 == 0) && (year % 100 || (year % 400 == 0))) {
168 yday++;
169 }
170 }
171
172 tp->ngx_tm_sec = sec;
173 tp->ngx_tm_min = min;
174 tp->ngx_tm_hour = hour;
175 tp->ngx_tm_mday = mday;
176 tp->ngx_tm_mon = mon;
177 tp->ngx_tm_year = year;
178 tp->ngx_tm_wday = wday;
179}