date_default_timezone_set的问题

 在php中,我们可以通过date函数来获取系统当前时间,date函数的参数已经够丰富了,其中包括自定义时期显示格式和获取相应时区的功能。但是强大的功能没法自定时区来输出。举个例子,在locale = ZH_CN的操作系统上,date函数可能输出UTC+8的时间。也就是标准的北京时间,这与操作系统shell中使用date命令查看的结果一样。但是在有的业务系统中,我们可能会提供接口给管理员配置业务系统的时间显示区域,即配置时区。例如,在locale=zh-cn的操作系统中设置时区为Asia/Seoul(朝鲜,UTC+9)。则使用date命令和PHP中使用date函数输出的时间相差1小时(东8区和东9区相差一小时)。在php5.1之后的版本中,为了灵活地根据指定的时区来获取时间,解释器提供了获取和设定时区的接口date_default_timezone_set。这样,假如我们需要使date命令和phpdate函数去到的时间一样,我们可以这样

date_default_timezone_set('Asia/Seoul’);
 date( 'Y-m-d H:i' )。这是我们一般设定默认时区的做法,但这样两个问题:
一 date_default_timezone_set作用域问题
    date_default_timezone_set的作用域只限于当前模块,假如我们的程序第一次请求A.getDate.在这个方法中,我们调用date_default_timezone_set来重设了默认时区,当我们第二次请求 B.getDate时,第一次请求的date_default_timezone_set的设置不会影响到第二次请求。如果B.getDate中没有调用date_default_timezone_set。那么date函数将会得到一个和date命令不一样的结果。也就是说date_default_timezone_set函数不会对操作系统甚至php解释器环境造成永久的影响。当一次请求被解释返回后,date_default_timezone_set的结果会被解释器释放。这是其一。
二  date_default_timezone_set会对exec函数造成影响。
    php可以通过exec来调用外部程序,例如执行ls -l /etc/localtime (CMD)。如果在调用exec之前php解释器调用了date_default_timezone_set(针对同一次请求)。那么CMD的返回结果会和在shell中执行ls -l /etc/localtime的结果有所不同。其中不一同的地方是文件日期的现实格式和日期的内容。也就是说在date_default_timezone_set之后的exec函数输入的时间格式会受到date_default_timezone_set设定的时区的影响。因此,当exec调用的命令会返回一个日期,而这个返回结果对程序很重要时,需要慎重。
 
由于一样两个原因,在提供系统可配置时区的接口的同时,我不得不修改需要exec返回结果带有日期的地方。
 
另:
   php exec函数在执行shell命令时貌似awk '{print $NF}'不起作用。该命令不是返回最后一个字段。而是将整行输出。
在shell中执行相同的命令没有此问题。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章