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
|
<?php /** * WPSEO plugin file. * * @package WPSEO\XML_Sitemaps */
/** * Class WPSEO_Sitemap_Timezone. */ class WPSEO_Sitemap_Timezone {
/** * Holds the timezone string value to reuse for performance. * * @var string $timezone_string */ private $timezone_string = '';
/** * Format arbitrary UTC datetime string to desired form in site's time zone. * * @param string $datetime_string The input datetime string in UTC time zone. * @param string $format Date format to use. * * @return string */ public function format_date( $datetime_string, $format = 'c' ) {
$date_time = $this->get_datetime_with_timezone( $datetime_string );
if ( is_null( $date_time ) ) { return ''; }
return $date_time->format( $format ); }
/** * Get the datetime object, in site's time zone, if the datetime string was valid * * @param string $datetime_string The datetime string in UTC time zone, that needs * to be converted to a DateTime object. * * @return DateTime|null DateTime object in site's time zone. */ public function get_datetime_with_timezone( $datetime_string ) {
static $utc_timezone, $local_timezone;
if ( ! isset( $utc_timezone ) ) { $utc_timezone = new DateTimeZone( 'UTC' ); $local_timezone = new DateTimeZone( $this->get_timezone_string() ); }
if ( ! empty( $datetime_string ) && WPSEO_Utils::is_valid_datetime( $datetime_string ) ) { $datetime = new DateTime( $datetime_string, $utc_timezone ); $datetime->setTimezone( $local_timezone );
return $datetime; }
return null; }
/** * Returns the timezone string for a site, even if it's set to a UTC offset. * * Adapted from {@link http://www.php.net/manual/en/function.timezone-name-from-abbr.php#89155}. * * @return string Valid PHP timezone string. */ private function determine_timezone_string() {
// If site timezone string exists, return it. $timezone = get_option( 'timezone_string' ); if ( ! empty( $timezone ) ) { return $timezone; }
// Get UTC offset, if it isn't set then return UTC. $utc_offset = (int) get_option( 'gmt_offset', 0 ); if ( 0 === $utc_offset ) { return 'UTC'; }
// Adjust UTC offset from hours to seconds. $utc_offset *= HOUR_IN_SECONDS;
// Attempt to guess the timezone string from the UTC offset. $timezone = timezone_name_from_abbr( '', $utc_offset );
if ( false !== $timezone ) { return $timezone; }
// Last try, guess timezone string manually. $timezone_list = timezone_abbreviations_list(); foreach ( $timezone_list as $abbr ) { foreach ( $abbr as $city ) { if ( $city['offset'] === $utc_offset ) { return $city['timezone_id']; } } }
// Fallback to UTC. return 'UTC'; }
/** * Returns the correct timezone string. * * @return string */ private function get_timezone_string() { if ( '' === $this->timezone_string ) { $this->timezone_string = $this->determine_timezone_string(); }
return $this->timezone_string; } }
|