1 /*
2 +----------------------------------------------------------------------+
3 | PHP Version 5 |
4 +----------------------------------------------------------------------+
5 | Copyright (c) 1997-2013 The PHP Group |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 3.01 of the PHP license, |
8 | that is bundled with this package in the file LICENSE, and is |
9 | available through the world-wide-web at the following url: |
10 | http://www.php.net/license/3_01.txt |
11 | If you did not receive a copy of the PHP license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@php.net so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
15 | Authors: Andi Gutmans <andi@zend.com> |
16 | Zeev Suraski <zeev@zend.com> |
17 | Rasmus Lerdorf <rasmus@php.net> |
18 +----------------------------------------------------------------------+
19 */
20
21 /* $Id$ */
22
23 #include "php.h"
24 #include "zend_operators.h"
25 #include "datetime.h"
26 #include "php_globals.h"
27
28 #include <time.h>
29 #ifdef HAVE_SYS_TIME_H
30 # include <sys/time.h>
31 #endif
32 #include <stdio.h>
33
34 char *mon_full_names[] = {
35 "January", "February", "March", "April",
36 "May", "June", "July", "August",
37 "September", "October", "November", "December"
38 };
39
40 char *mon_short_names[] = {
41 "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
42 };
43
44 char *day_full_names[] = {
45 "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
46 };
47
48 char *day_short_names[] = {
49 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
50 };
51
52 /* {{{ PHPAPI char *php_std_date(time_t t TSRMLS_DC)
53 Return date string in standard format for http headers */
php_std_date(time_t t TSRMLS_DC)54 PHPAPI char *php_std_date(time_t t TSRMLS_DC)
55 {
56 struct tm *tm1, tmbuf;
57 char *str;
58
59 tm1 = php_gmtime_r(&t, &tmbuf);
60 str = emalloc(81);
61 str[0] = '\0';
62
63 if (!tm1) {
64 return str;
65 }
66
67 if (PG(y2k_compliance)) {
68 snprintf(str, 80, "%s, %02d %s %04d %02d:%02d:%02d GMT",
69 day_short_names[tm1->tm_wday],
70 tm1->tm_mday,
71 mon_short_names[tm1->tm_mon],
72 tm1->tm_year + 1900,
73 tm1->tm_hour, tm1->tm_min, tm1->tm_sec);
74 } else {
75 snprintf(str, 80, "%s, %02d-%s-%02d %02d:%02d:%02d GMT",
76 day_full_names[tm1->tm_wday],
77 tm1->tm_mday,
78 mon_short_names[tm1->tm_mon],
79 ((tm1->tm_year) % 100),
80 tm1->tm_hour, tm1->tm_min, tm1->tm_sec);
81 }
82
83 str[79] = 0;
84 return (str);
85 }
86 /* }}} */
87
88 #if HAVE_STRPTIME
89 #ifndef HAVE_STRPTIME_DECL_FAILS
90 char *strptime(const char *s, const char *format, struct tm *tm);
91 #endif
92
93 /* {{{ proto string strptime(string timestamp, string format)
94 Parse a time/date generated with strftime() */
PHP_FUNCTION(strptime)95 PHP_FUNCTION(strptime)
96 {
97 char *ts;
98 int ts_length;
99 char *format;
100 int format_length;
101 struct tm parsed_time;
102 char *unparsed_part;
103
104 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &ts, &ts_length, &format, &format_length) == FAILURE) {
105 return;
106 }
107
108 memset(&parsed_time, 0, sizeof(parsed_time));
109
110 unparsed_part = strptime(ts, format, &parsed_time);
111 if (unparsed_part == NULL) {
112 RETURN_FALSE;
113 }
114
115 array_init(return_value);
116 add_assoc_long(return_value, "tm_sec", parsed_time.tm_sec);
117 add_assoc_long(return_value, "tm_min", parsed_time.tm_min);
118 add_assoc_long(return_value, "tm_hour", parsed_time.tm_hour);
119 add_assoc_long(return_value, "tm_mday", parsed_time.tm_mday);
120 add_assoc_long(return_value, "tm_mon", parsed_time.tm_mon);
121 add_assoc_long(return_value, "tm_year", parsed_time.tm_year);
122 add_assoc_long(return_value, "tm_wday", parsed_time.tm_wday);
123 add_assoc_long(return_value, "tm_yday", parsed_time.tm_yday);
124 add_assoc_string(return_value, "unparsed", unparsed_part, 1);
125 }
126 /* }}} */
127
128 #endif
129
130 /*
131 * Local variables:
132 * tab-width: 4
133 * c-basic-offset: 4
134 * End:
135 * vim600: sw=4 ts=4 fdm=marker
136 * vim<600: sw=4 ts=4
137 */
138