多数大学生出来选择的工作和专业无关
首页 > 专业知识

PHP中date时差问题解决方法

时间:2018-11-22 19:56:58 [来源]:郑州PHP培训学校

   PHP中date时差问题解决方法

  今天遇到 date(“Y-m-d H:i:s”) 的时间总是与实际时间对不上。于是查询了相关资料知道了原因,整理如下。
  出现这一现象的原因:
  从php5.1.0开始,php.ini里加入了date.timezone这个选项,默认情况下是关闭的,也就是显示的时间时区。默认情况都是格林威治标准时间和我们的时间(北京时间)差了正好8个小时。
  解决方法:
  1、最简单的方法就是不要用php5.1以上的版本2、修改php.ini配置文件
  可在php.ini中查找date.timezone并修改.
  Windows下php.ini一般在:C:/WINDOWS/php.iniLinux下php.ini一般在:/etc/php.ini
  按照上面提示找到php.ini下的date.timezone 这行,如果找不到可以自行添加。去除前面的分号,修改成 date.timezone = “Asia/Shanghai”,记得重启http服务(如apache2或iis等)即可。
  date.timezone 分号后面的值参考,
  大陆内地可用的值是:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi (依次为重庆,上海,乌鲁木齐)港台地区可用:Asia/Macao ,Asia/Hong_Kong ,Asia/Taipei (依次为澳门,香港,台北)还有新加坡:Asia/Singapore
  老外好像把北京漏调了
  其他可用的值是:Etc/GMT-8 ,Singapore ,Hongkong ,PRCPRC是什么?PRC是中华人民共和国啊
  3、如果一定要用php5.1以上的版本,而且不能修改php.ini配置文件。
  (1)在PHP代码处理时间时添加8小时得到正确中国时间 date(‘Y-m-d H:i:s’, time()+8*3600);(2)在关于时间的初始化语句上面加上 date_default_timezone_set (XXX),或者在页头使用date_default_timezone_set(XXX)设置我的默认时区为北京时间 date_default_timezone_set(’Asia/Shanghai’)也可以。
  格式字串可以识别以下 format 参数的字符串
  format字符说明返回值例子
  日——
  d月份中的第几天,有前导零的 2 位数字01 到 31D星期中的第几天,文本表示,3 个字母Mon 到 Sunj月份中的第几天,没有前导零1 到 31
  l(“L”的小写字母)星期几,完整的文本格式Sunday 到 SaturdayNISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加)1(表示星期一)到 7(表示星期天)S每月天数后面的英文后缀,2 个字符st,nd,rd 或者 th。可以和 j 一起用w星期中的第几天,数字表示0(表示星期天)到 6(表示星期六)z年份中的第几天0 到 365
  星期——
  WISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的)例如:42(当年的第 42 周)月——
  F月份,完整的文本格式,例如 January 或者 MarchJanuary 到 Decemberm数字表示的月份,有前导零01 到 12
  M三个字母缩写表示的月份Jan 到 Dec
  n数字表示的月份,没有前导零1 到 12
  t给定月份所应有的天数28 到 31
  年——
  L是否为闰年如果是闰年为 1,否则为 0
  oISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO 的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加)Examples: 1999 or 2003Y4 位数字完整表示的年份例如:1999 或 2003y2 位数字表示的年份例如:99 或 03
  时间——
  a小写的上午和下午值am 或 pm
  A大写的上午和下午值AM 或 PM
  BSwatch Internet 标准时000 到 999
  g小时,12 小时格式,没有前导零1 到 12
  G小时,24 小时格式,没有前导零0 到 23
  h小时,12 小时格式,有前导零01 到 12
  H小时,24 小时格式,有前导零00 到 23
  i有前导零的分钟数00 到 59>
  s秒数,有前导零00 到 59>
  时区——
  e时区标识(PHP 5.1.0 新加)例如:UTC,GMT,Atlantic/AzoresI是否为夏令时如果是夏令时为 1,否则为 0
  O与格林威治时间相差的小时数例如:+0200
  P与格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(PHP 5.1.3 新加)例如:+02:00T本机所在的时区例如:EST,MDT(【译者注】在 Windows 下为完整文本格式,例如“Eastern Standard Time”,中文版会显示“中国标准时间”)。
  Z时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。-43200 到 43200完整的日期/时间——
  cISO 8601 格式的日期(PHP 5 新加)2004-02-12T15:19:21+00:00rRFC 822 格式的日期例如:Thu, 21 Dec 2000 16:01:07 +0200U从 Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数参见 time()PHP数组关于数字键名的问题
  以下是对PHP数组数字键名的几点总结:
  键名长度只能在 int 长度范围内,超过int 范围后将会出现覆盖等混乱情况在键名长度为 int 范围内存取值时,PHP会强制将数字键名转换为 int 数值型数字键名长度大于19位时,将变成 0
  键名正常长度时,字符串或数值类型一样
  $i = 126545165;$arr['126545165'] = 'abc';$arr[126545165] = 'uio';var_dump($arr);echo '</p><p>    ';var_dump(isset($arr[$i]));长度超过整型时,键名混乱<喎?http:///kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PHByZSBjbGFzcz0="brush:java;">$i = 12312312312312;$arr['1000000000147483649'] = 'abc';$arr[1000000000147483649] = 'uio';var_dump($arr);echo '
  ';var_dump(isset($arr[$i]));
  长度超过20位时,键名将变成 0
  $i = 123123123123123123123123123123;var_dump($i);echo '</p><p>    ';$arr[123123123123123123123123123123] = 'abc';$arr[strval(123123123123123123123123123123)] = 'abc';var_dump($arr);echo '</p><p>    ';var_dump(isset($arr[$i]));echo '</p><p>    ';var_dump(isset($arr[strval($i)]));echo '</p><p>    ';var_dump(array_keys($arr));将变量直接作为键名存取,结果又有不同
  $i = 123123123123123;var_dump($i);echo '</p><p>    ';$arr[$i] = 'abc';$arr[strval($i)] = 'abc';var_dump($arr);echo '</p><p>    ';var_dump(isset($arr[$i]));echo '</p><p>    ';var_dump(isset($arr[strval($i)]));echo '</p><p>    ';var_dump(array_keys($arr));从上面的几种测试来看:
  如果键名为数字,且范围在 int 以内,字符串或者 int 不会对存取有什么影响如果长度大于 int 时会自动转化为 float ,再转换进行存取出现各种混乱情况,甚至直接变成 0,所以最好是统一转换为 string 类型$i = 123123123123123123123123123123;$j = '123123123123123123123123123123';$arr1[strval($i)] = 'abc';$arr2[$j] = 'abc';var_dump($arr1);echo '</p><p>    ';var_dump($arr2);所以在动态操作 PHP 数组时,如果不能确定键名是否会出现数字或者长度大于 int ,则统一将键名 strval 转换为 字符串来操作最为稳妥PHPmailer群发Gmail的常见问题
  1.Could not authenticate
  首先,如果你没有使用循环的话,基本上就是账号或者密码错了;如果使用循环来群发,send()方法结束之后记得调用Smtpclose(),发一次关一次,否则就会出现只能发一封邮件,第二次就崩溃的情况。
  2.Gmail
  首先,开启php的ssl权限
  php开启openssl的方法,大多数情况下openssl是没有开启的,要想启用需要进行下简单的设置:
  windows下开启方法:
  1: 首先检查php.ini中;extension=php_openssl.dll是否存在, 如果存在的话去掉前面的注释符‘;’, 如果不存在这行,那么添加extension=php_openssl.dll。
  2: 讲php文件夹下的: php_openssl.dll, ssleay32.dll, libeay32.dll 3个文件拷贝到 WINDOWS\system32\ 文件夹下。
  3: 重启apache或者iis
  至此,openssl功能就开启了。
  Linux下开启方法:
  我使用的是锦尚数据的云主机,PHP版本:5.2.14下面方案就以我的主机为例讲解为PHP添加openssl模块支持。
  网上一些答案说要重新编译PHP,添加configure参数,增加openssl的支持。这里讲一个不需要重新编译的方法。
  如果服务器上存在PHP安装包文件最好,如果已经删除,去下载和phpinfo页面显示版本一样的PHP安装文件,我这里是 php-5.2.14.tar.gz推荐去搜狐镜像下载,网易镜像没有找到。地址为: http://mirrors.sohu.com/php/用ssh工具连接到主机。
  # 下载到/var/www/php5目录下
  cd /var/www/php5
  wget http://mirrors.sohu.com/php/php-5.2.14.tar.gz# 解压
  tar zxvf php-5.2.14.tar.gz
  # 进入PHP的openssl扩展模块目录
  cd php-5.2.14/ext/openssl/
  /var/www/php5/bin/phpize # 这里为你自己的phpize路径,如果找不到,使用whereis phpize查找# 执行后,发现错误 无法找到config.m4 ,config0.m4就是config.m4。直接重命名mv config0.m4 config.m4
  /var/www/php5/bin/phpize
  ./configure --with-openssl --with-php-config=/var/www/php5/bin/php-configmake
  make install
  # 安装完成后,会返回一个.so文件(openssl.so)的目录。在此目录下把openssl.so 文件拷贝到你在php.ini 中指定的 extension_dir 下(在php.ini文件中查找:extension_dir =),我这里的目录是 var/www/php5/lib/php/extensions# 编辑php.ini文件,在文件最后添加
  extension=openssl.so
  # 重启Apache即可
  /usr/local/apache2/bin/apachectl restart
  好了,现在就成功添加openssl支持。
  但是,Gmail麻烦的地方可不止这样,Gmail现在的smtp和pop3都是ssl加密的Step1. php openssl module(extension) supportStep2. download phpmailer library
  Step3. change code 'class.phpmailer.php' and 'class.smtp.php'
  1.phpmailer和smtp里加property Is_SSL
  public $Is_SSL = false;
  2.phpmailer里的SmtpConnect方法里传递给smtp对象$this->smtp-> Is_SSL = $this-> Is_SSL ;
  3.smtp里的Connect方法在fsockopen调用前加上if($this->is_ssl){ $host = 'ssl://'.$host; }
  最后是使用方法,记得调用phpmailer类哦,代码里没有。
 

上一篇:25个顶级PHP模板引擎整理

下一篇:php用户注册信息验证正则表达式_PHP