strtotime方法使用前请注意系统时区

strtotime在将一个潜在的时间字符串转换为正确的时间时,会使用到当前系统时区。如果系统时区与所给目标字符串所示时区不一样时,那么在调用后,其生成的时间将与想象中的时间有时间偏差。因此,需要在调用该方法前,首先确定当前系统时区。

 

我们可以调用date_default_timezone_get()获取当前时区。通常默认的时区为UTC也就是标准时区+0000;设置系统时区有两种方式:

1、修改php.ini配置文件。

[Date]
; Defines the default timezone used by the date functions
;date.timezone =

将上述部分的date.tiemzone放开,并设置为需要的时区

 

2、在需要设置时区的地方调用date_default_timezone_set()方法来设置时区。

 

下面我们就以"Sat May 14 22:35:44 +0800 2011"为例进行说明。我们的目标是获取其中的'22:35:44'时间。

 

可以看到'Sat May 14 22:35:44 +0800 2011'为+0800时区,也就是所谓的北京时间了。那么我们需要在strtotime该字符串前,确保系统时区为北京时区。PHP中北京时区可以用PRC表示。如果是PHP5+也可用Asia/Shanghai或者Asia/Chongqing来设置。

 

这里我们采用第二种方式来设置系统时区。我们的测试代码如下:

<?
	$str = 'Sat May 14 22:35:44 +0800 2011';
	$current_timezone = date_default_timezone_get();
	
	$strTtime = strtotime($str);
	
?>
<table border = '1'>
		<caption>未设定时区前</caption>
		<tr>
			<td>时间字符串</td>
			<td><?=$str?></td>
		</tr>
		<tr>
			<td>当前时区</td>
			<td><?=$current_timezone?></td>
		</tr>
		<tr>
			<td>字符转化后日期格式('r')</td>
			<td><?=date('r',$strTtime)?></td>
		</tr>
		<tr>
			<td>字符转化后日期格式('H:i:s')</td>
			<td><?=date('H:i:s',$strTtime)?></td>
		</tr>
</table>
<br/></br>
<?
	date_default_timezone_set('Asia/Shanghai'); 
	$l_current_timezone = date_default_timezone_get();
	$l_strTtime = strtotime($str);
?>
<table border = '1'>
		<caption>设定时区后</caption>
		<tr>
			<td>时间字符串</td>
			<td><?=$str?></td>
		</tr>
		<tr>
			<td>当前时区</td>
			<td><?=$l_current_timezone?></td>
		</tr>
		<tr>
			<td>字符转化后日期格式('r')</td>
			<td><?=date('r',$l_strTtime)?></td>
		</tr>
		<tr>
			<td>字符转化后日期格式('H:i:s')</td>
			<td><?=date('H:i:s',$l_strTtime)?></td>
		</tr>
</table>
<? 
	//使用完成后,还原到系统默认的设置
	date_default_timezone_set($current_timezone);
?>

显示结果如下:

 

未设定时区前
时间字符串 Sat May 14 22:35:44 +0800 2011
当前时区 UTC
字符转化后日期格式('r') Sat, 14 May 2011 14:35:44 +0000
字符转化后日期格式('H:i:s') 14:35:44

 

设定时区后
时间字符串 Sat May 14 22:35:44 +0800 2011
当前时区 Asia/Shanghai
字符转化后日期格式('r') Sat, 14 May 2011 22:35:44 +0800
字符转化后日期格式('H:i:s') 22:35:44

注意: 在使用第二种方式时,在使用完成后,应将系统时区还原到初始设置。避免后续调用错误。

 

PS: 其他的时区设置及代码中涉及到的方法,可以通过查看PHP API了解更多的用法。http://www.php.net/manual/zh/index.php

你可能感兴趣的:(strtotime方法使用前请注意系统时区)