xref: /PHP-7.2/ext/standard/datetime.c (revision 7a7ec01a)
1 /*
2    +----------------------------------------------------------------------+
3    | PHP Version 7                                                        |
4    +----------------------------------------------------------------------+
5    | Copyright (c) 1997-2018 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)
53    Return date string in standard format for http headers */
php_std_date(time_t t)54 PHPAPI char *php_std_date(time_t t)
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 	snprintf(str, 80, "%s, %02d %s %04d %02d:%02d:%02d GMT",
68 			day_short_names[tm1->tm_wday],
69 			tm1->tm_mday,
70 			mon_short_names[tm1->tm_mon],
71 			tm1->tm_year + 1900,
72 			tm1->tm_hour, tm1->tm_min, tm1->tm_sec);
73 
74 	str[79] = 0;
75 	return (str);
76 }
77 /* }}} */
78 
79 #if HAVE_STRPTIME
80 #ifndef HAVE_STRPTIME_DECL_FAILS
81 char *strptime(const char *s, const char *format, struct tm *tm);
82 #endif
83 
84 /* {{{ proto string strptime(string timestamp, string format)
85    Parse a time/date generated with strftime() */
PHP_FUNCTION(strptime)86 PHP_FUNCTION(strptime)
87 {
88 	char      *ts;
89 	size_t        ts_length;
90 	char      *format;
91 	size_t        format_length;
92 	struct tm  parsed_time;
93 	char      *unparsed_part;
94 
95 	ZEND_PARSE_PARAMETERS_START(2, 2)
96 		Z_PARAM_STRING(ts, ts_length)
97 		Z_PARAM_STRING(format, format_length)
98 	ZEND_PARSE_PARAMETERS_END();
99 
100 	memset(&parsed_time, 0, sizeof(parsed_time));
101 
102 	unparsed_part = strptime(ts, format, &parsed_time);
103 	if (unparsed_part == NULL) {
104 		RETURN_FALSE;
105 	}
106 
107 	array_init(return_value);
108 	add_assoc_long(return_value, "tm_sec",   parsed_time.tm_sec);
109 	add_assoc_long(return_value, "tm_min",   parsed_time.tm_min);
110 	add_assoc_long(return_value, "tm_hour",  parsed_time.tm_hour);
111 	add_assoc_long(return_value, "tm_mday",  parsed_time.tm_mday);
112 	add_assoc_long(return_value, "tm_mon",   parsed_time.tm_mon);
113 	add_assoc_long(return_value, "tm_year",  parsed_time.tm_year);
114 	add_assoc_long(return_value, "tm_wday",  parsed_time.tm_wday);
115 	add_assoc_long(return_value, "tm_yday",  parsed_time.tm_yday);
116 	add_assoc_string(return_value, "unparsed", unparsed_part);
117 }
118 /* }}} */
119 
120 #endif
121 
122 /*
123  * Local variables:
124  * tab-width: 4
125  * c-basic-offset: 4
126  * End:
127  * vim600: sw=4 ts=4 fdm=marker
128  * vim<600: sw=4 ts=4
129  */
130