PHP中的时间有2个格式化函数:date()和gmdate(),在官方的文档中的描述为:

  date -- 格式化一个本地时间/日期

  gmdate -- 格式化一个 GMT/UTC 日期/时间,返回的是格林威治标准时(GMT)。

  举个例子,我们现在所在的时区是+8,那么服务器运行以下脚本返回的时间应该是这样的:

  当前时间假定是2007-03-14 12:15:27

  echo date('Y-m-d H:i:s', time()); 输出为:2007-03-14 12:15:27

  echo gmdate('Y-m-d H:i:s', time()); 输出为:2007-03-14 04:15:27

  但是这只是在Linux+Apache下运行PHP所得的结果,如果在Windows下运行,则2个函数返回都是:2007-03-14 04:15:27。

  所以,我们应该给一个兼容性的写法,统一使用gmdate,并手工设置当前时区,写法改进如下:

  echo gmdate('Y-m-d H:i:s', time() + 3600 * 8);

 
 这样不管在Linux+Apache下还是Windows下都得到了正确的结果,当然这样写还有一个好处,当网站是面向全世界的时候,那么网站用户只要
设置所在的时区,程序自动根据用户设置的时区进行时间计算,数据库中信息发布时间只存当前的time()所生成的时间,那么在中国+8时区看到的发布时间
是:2007-03-14 12:15:27,那么在欧洲+2时区用户看到这个信息的发布时间是:2007-03-14
06:15:27,这样信息的时间就全部对应正确了。

====================================================

修改PHP的默认时区

  每个地区都有自己的本地时间,在网上以及无线电通信中,时间的转换问题就显得格外突出。整个地球分为二十四个时区,每个时区都有自己的本地时间。在国
际无线电或网络通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC,Universal Time
Coordinated),是由世界时间标准设定的全球标准时间。UTC原先也被称为格林威治标准时间(GMT,Greenwich Mean
Time),都与英国伦敦的本地时间相同。

PHP默认的时区设置是UTC时间,而北京正好位于时区的东八区,领先UTC八个小时。所以在使用PHP中像time()等获取当前时间的函数时,
得到的时间总是不对,表现是和北京时间相差八个小时。如果希望正确的显示北京时间,就需要修改默认的时区设置,可以通过以下两种方式完成。

如果使用的是独立的服务器,有权限修改配置文件,设置时区就可以通过修改php.ini中的date.timezone属性完成。我们可以将这个属
性的值设置为"Asia/Shang"、"Asia/Chongqing"、"Etc/GMT-8"或PRC等中的一个,再在PHP脚本中获取的当前时间
就是北京时间。修改PHP的配置文件如下所示:

  1. date.timezone = Etc/GMT-8       
    //在配置文件中设置默认时区为东8区(北京时间)

如果您使用的是共享服务器,没有权限修改配置文件php.ini,并且PHP版本又在5.1.0以上,也可以在输出时间之前调用 date_default_timezone_set()函数设置时区。该函数需要提供一个时区标识符作为参数,和配置文件中date.timezone 属性的值相同。该函数的使用如下所示:

  1. date_default_timezone_set('PRC');          
    //在输出时间之前设置时区,PRC为中华人民共和国
  2. echo date('Y-m-d H:i:s', time());        
    //输出的当前时间为北京时间

测试:


代码

<?php
date_default_timezone_set('Etc/GMT');     
//在输出时间之前设置时区,Etc/GMT为时间标准时间
echo(time()); 
echo('<br/>');
echo date('Y-m-d H:i:s', time());        
echo('<br/>');
echo gmdate ("Y-m-d H:i:s",  time());
echo('<br/>'); date_default_timezone_set('PRC');     
//在输出时间之前设置时区,PRC为中华人民共和国 
echo(time()); 
echo('<br/>');
echo date('Y-m-d H:i:s', time());        
echo('<br/>');
echo gmdate ("Y-m-d H:i:s",  time()); ?> 

结果:


-- ::
-- :: -- ::
-- :: 

结论:

 time() :标准时间戳

  指返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间(指的是当前GMT标准时间)的秒数,它的值跟php系统设置的时区无关
date():返回的是当前 GMT标准时间的本地化时间的“自定义格式”时间,跟php系统设置的时区有关。

gmdate():返回的是当前 GMT标准时间的“自定义格式”时间,跟php系统设置的时区无关。

=====================================================

unix时间戳:指的是当前(GMT标准)时间离unix纪元时间(1970-01-01 00:00:00)的秒数;


代码

<?php
date_default_timezone_set('Etc/GMT');     
//在输出时间之前设置时区,Etc/GMT为时间标准时间
echo(strtotime('1970-01-01 08:00:00')); echo('<br/>');
date_default_timezone_set('PRC');     
//在输出时间之前设置时区,PRC为中华人民共和国  echo(strtotime('1970-01-01 08:00:00')); ?> 

测试结果:


 

strtotime(a):当前时间的GMT标准时间的unix时间戳,如果当前php系统的设置的时区不是GMT标准时区,则在应用strtotime(a)时,系统会自动把时间a折算成相应的GMT标准时间,然后计算这个时间的unix时间戳。跟php系统设置的时区有关

uchome系统时间函数:


代码

 1 /**
 2  * 01时间格式化   eg. sgmdate('Y-m-d')
 3  * @param $dateformat 时间格式(必选)
 4  * @param $timestamp='' 时间戳
 5  * @param $format=0 是否要格式化(n小时前|n分钟前|n秒钟前|现在),1:打开 0:关闭
 6  * */
 7 function sgmdate($dateformat, $timestamp='', $format=) {
 8     global $_SCONFIG, $_SGLOBAL;
 9     if(empty($timestamp)) {
         $timestamp = $_SGLOBAL['timestamp'];
     }
     //时差:与格林威治标准时间(GMT)的时差
     $timeoffset = strlen($_SGLOBAL['member']['timeoffset'])>?intval($_SGLOBAL['member']['timeoffset']):intval($_SCONFIG['timeoffset']);
     $result = '';
     if($format) {
         $time = $_SGLOBAL['timestamp'] - $timestamp;
         if($time > *) {//相差1天以上
             $result = gmdate($dateformat, $timestamp + $timeoffset * );
         } elseif ($time > ) {//相差1小时以上:n小时前
             $result = intval($time/).lang('hour').lang('before');
         } elseif ($time > ) {//相差1分钟以上:n分钟前
             $result = intval($time/).lang('minute').lang('before');
         } elseif ($time > ) {//相差0秒钟以上:n秒钟前
             $result = $time.lang('second').lang('before');
         } else {//现在
             $result = lang('now');
         }
     } else {
         $result = gmdate($dateformat, $timestamp + $timeoffset * );
     }
     return $result;
 }
 /**
  * 02字符串时间化(将任何英文文本的日期时间描述解析为 Unix 时间戳)
  * 注意:不管php系统设置的是GMT标准时间,还是其它时间标准,此函数返回的都是GMT标准时间戳
  * */
 function sstrtotime($string) {
     global $_SGLOBAL, $_SCONFIG;
     $time = '';
     if($string) {
         $time = strtotime($string);
         //若php系统设置的是GMT标准时间
         if(gmdate('H:i', $_SGLOBAL['timestamp'] + $_SCONFIG['timeoffset'] * ) != date('H:i', $_SGLOBAL['timestamp'])) {
             $time = $time - $_SCONFIG['timeoffset'] * ;
         }
     }
     return $time;
 }

最新文章

  1. 使用bootstrap 弹出效果演示
  2. python 学习笔记十二 CSS基础(进阶篇)
  3. 使用jQuery 的.on() 提交表单
  4. strace命令介绍(转)
  5. php中alert弹出时单双引号问题
  6. MVC程序实现Autocomplete功能
  7. 轻量级的jquery
  8. Lua 代码编写技巧
  9. CSS中样式覆盖优先顺序
  10. python【第十六篇】DOM
  11. Play Apple(博弈)
  12. 编程算法 - 有序双循环链表的插入 代码(C)
  13. hdu2713(dp)
  14. JavaScript在智能手机上的应用-判断是否为移动浏览器
  15. 每天一个Linux命令—— WC
  16. Chome——扩展程序,获取更多扩展程序报错
  17. 三种ajax上传文件方法
  18. [USACO4.1]麦香牛块Beef McNuggets
  19. python爬虫requests 下载图片
  20. SYBASE bcp用法及例子

热门文章

  1. 转:Selenium2.0介绍——WebDriver两种驱动浏览器的方式.
  2. MFC 窗体背景图片设置
  3. android从asset文件夹读取文件
  4. Android中监听webview监听是否加载完成
  5. opencv-jni -调试出错taking address of temporary [-fpermissive]
  6. cell选中与取消选中调用的方法
  7. ZOJ3944People Counting&lt;暴力/枚举&gt;
  8. css---使用class和id
  9. locks
  10. Extjs4---Cannot read property 'addCls' of null - heirenheiren的专栏 - 博客频道 - CSDN.NET