2011-02-15 53 views
0

以下程序的输出可以在这里看到:http://codepad.org/egNGJBULPHP date()函数忽略时间戳参数

<?php 

/* Checking if time() is really timezone independent */ 

date_default_timezone_set('UTC'); 
echo time(); 
echo "\n"; 
date_default_timezone_set('Australia/Queensland'); 
echo time(); 
echo "\n"; 

/* Using date() function passing timestamp parameter */ 

date_default_timezone_set('UTC'); 
echo date('Y-m-d H:i:s',time()); 
echo "\n"; 
date_default_timezone_set('Australia/Queensland'); 
echo date('Y-m-d H:i:s',time()); 
echo "\n"; 


/* Using date() function without passing timestamp parameter */ 

date_default_timezone_set('UTC'); 
echo date('Y-m-d H:i:s'); 
echo "\n"; 
date_default_timezone_set('Australia/Queensland'); 
echo date('Y-m-d H:i:s'); 
echo "\n"; 

从输出中,我们可以看到time()的1-2线返回一个值,这是真的时区独立。

在第3-4行中,很奇怪date()函数会忽略时间戳参数,并仍然根据设置的时区显示日期时间。

这是为什么?

回答

2

不确定你期望看到什么,但是,对我来说看起来很正常。

时间戳是从某个时间点(通常是UNIX EPOCH)开始计算的整数。虽然这个值的显示是独立于时区的,但没有更多或更少的意思,说一个格式正确的日期的值用时区表示,与时区无关...

例如,所有以下语句都是真的(逻辑上)

1297799809 == 1297799809 

2011-02-15 19:56:49 (UTC) == 2011-02-16 05:56:49 (Austria/Queensland) 

所有时间都是'时区独立'。时区仅影响我们在特定时刻显示的方式。

1

date()函数第二个参数,如果未指定,则为time()值。

date()根据给定的格式字符串,使用给定的整数时间戳或当前时间(如果未给出时间戳)返回格式化字符串。换句话说,时间戳是可选的,并且默认为time()的值。

from date()'s manual

因此,实际上什么都没有ingnored。

1

date函数返回为当前时区计算的时间戳的日期,如其他人所说的,如果没有时间戳传递给它,则当前时间用于时间戳,因此传递time()与未相同传递任何东西。

但是,做一些像$time = time();sleep 5;echo date($format,$time);会让你在过去5秒钟。

它意在显示为当前时区格式化的日期,因此您可以使用通用方法保持时间在计算机/服务器之间保持不变,并且易于分析,并且能够在所需的任何时区显示日期。

UTC时区实际上是计算时间戳的时间,更准确地说,是UTC自1970年1月1日00:00以来的秒数,然后它会从/到或从/中加上或减去3600(60 * 60)秒从UTC时间偏移每小时的时间戳,以获取当前设置的时区中的时间。