Where does WordPress get it’s daylight savings info
My question is, where does WordPress get the data from relating to automatic Timezone and DST change and how can I implement the same principal into converting a web app users selected local date and time into stored offsets to allow for their movement back and forward of clocks during daylight saving?
Obviously I can store this as UTC and then convert the time to their local Timezone on the fly, but this will still not accurately reflect the date and time they entered if they are in the opposite daylight savings setting as when the record was created. I am using asp.net c# with a sql server.
WordPress automatically reflects daylight saving time by selecting a city, not offset hours in WP-admin > Settings > General > Timezone. You will then see a notification like this:
This timezone is currently in daylight saving time.
Standard time begins on: Sunday 25.10. 04:00,
It is somewhere in the code of /wp-admin/options-general.php
<?php
$current_offset = get_option('gmt_offset');
$tzstring = get_option('timezone_string');
$check_zone_info = true;
// Remove old Etc mappings. Fallback to gmt_offset.
if ( false !== strpos($tzstring,'Etc/GMT') )
$tzstring = '';
if ( empty($tzstring) ) { // Create a UTC+- zone if no timezone string exists
$check_zone_info = false;
if ( 0 == $current_offset )
$tzstring = 'UTC+0';
elseif ($current_offset < 0)
$tzstring = 'UTC' . $current_offset;
else
$tzstring = 'UTC+' . $current_offset;
}
?>
<th scope="row"><label for="timezone_string"><?php _e('Timezone') ?></label></th>
<td>
<select id="timezone_string" name="timezone_string" aria-describedby="timezone-description">
<?php echo wp_timezone_choice( $tzstring, get_user_locale() ); ?>
</select>
<p class="description" id="timezone-description"><?php _e( 'Choose either a city in the same timezone as you or a UTC timezone offset.' ); ?></p>
<p class="timezone-info">
<span id="utc-time"><?php
/* translators: 1: UTC abbreviation, 2: UTC time */
printf( __( 'Universal time (%1$s) is %2$s.' ),
'<abbr>' . __( 'UTC' ) . '</abbr>',
'<code>' . date_i18n( $timezone_format, false, true ) . '</code>'
);
?></span>
<?php if ( get_option( 'timezone_string' ) || ! empty( $current_offset ) ) : ?>
<span id="local-time"><?php
/* translators: %s: local time */
printf( __( 'Local time is %s.' ),
'<code>' . date_i18n( $timezone_format ) . '</code>'
);
?></span>
<?php endif; ?>
</p>
<?php if ( $check_zone_info && $tzstring ) : ?>
<p class="timezone-info">
<span>
<?php
// Set TZ so localtime works.
date_default_timezone_set($tzstring);
$now = localtime(time(), true);
if ( $now['tm_isdst'] )
_e('This timezone is currently in daylight saving time.');
else
_e('This timezone is currently in standard time.');
?>
<br />
<?php
$allowed_zones = timezone_identifiers_list();
if ( in_array( $tzstring, $allowed_zones) ) {
$found = false;
$date_time_zone_selected = new DateTimeZone($tzstring);
$tz_offset = timezone_offset_get($date_time_zone_selected, date_create());
$right_now = time();
foreach ( timezone_transitions_get($date_time_zone_selected) as $tr) {
if ( $tr['ts'] > $right_now ) {
$found = true;
break;
}
}
if ( $found ) {
echo ' ';
$message = $tr['isdst'] ?
/* translators: %s: date and time */
__( 'Daylight saving time begins on: %s.') :
/* translators: %s: date and time */
__( 'Standard time begins on: %s.' );
// Add the difference between the current offset and the new offset to ts to get the correct transition time from date_i18n().
printf( $message,
'<code>' . date_i18n(
__( 'F j, Y' ) . ' ' . __( 'g:i a' ),
$tr['ts'] + ( $tz_offset - $tr['offset'] )
) . '</code>'
);
} else {
_e( 'This timezone does not observe daylight saving time.' );
}
}
// Set back to UTC.
date_default_timezone_set('UTC');
?>
</span>
$now = localtime(time(), true);
if ( $now['tm_isdst'] )
_e('This timezone is currently in daylight saving time.');
else
_e('This timezone is currently in standard time.');
I would use the localtime function, whatever library that comes out of.
--edit-- I would also note the lines:
// Set TZ so localtime works.
date_default_timezone_set($tzstring);
those will probably be necessary, I don't know, I don't write PHP.
链接地址: http://www.djcxy.com/p/5008.html上一篇: 具有填充/边距的CSS 100%高度
下一篇: WordPress在哪里获得夏令时信息