【PHP学习笔记(六)】管理日期和时间

系统时区的设置

系统时区是指运行PHP的系统环境。常见的又Windows系统和UNIX-like(如Linux)系统。对于它们时区的设置,关系到运行应用的时间准确性。

时区划分

  • 时区划分是一个地理概念,例如北京时间是东八区、美国太平洋时间是西八区。在Windows系统里,可以直接在控制面板设置。在Linux这样的UNIX-like系统中,需要使用命令对时区进行设置

时区设置

  • 在PHP中,日期时间的默认设置是GMT格林尼治时间。在使用时间日期功能之前,要对时区进行设置
  • 对时区的设置方法有两种
    • 修改php.ini文件的设置。将”;date.timezone=”的选项值修改为date.timezone=Asia/Hong_kong,这样系统默认时间为东八区的时间
    • 在应用程序中直接用函数date_fefault_timezone_set()来设置。语法格式为:date_fefault_timezone_set(“timezone”),参数timezone为PHP可以识别得市区名称。例如设置我国北京时间可以使用的时区包括:PRC、Asia/Chongqing、Asia/Hong_kong、Asia/Shanghai等

PHP的日期和时间函数

关于UNIX时间戳

  • 系统的时间就是以时间戳的方式存储的,称为UNIX时间戳。UNIX系统和UNIX-like系统把当下的时间储存为32位整数,这个整数的单位就是秒,而这个整数的开始时间为格林尼治时间的1970年1月1日的零点整。换句话说,就是现在的时间是GMT1970年1月1日的零点整到现在的秒数,由于每一秒的时间都是确定的,这个整数就像一个章戳一样不可改变,所以就称为UNIX时间戳
  • 这个时间戳在Windows系统下也是成立的,但是与UNIX系统不同的是,Windows系统下的时间戳只能为正整数,不能为负值,所以无法表示GMT1970年1月1日以前的时间。
  • PHP则完全采用了UNIX时间戳,不管PHP在那个系统下运行,都可以使用UNIX时间戳

获取当前的时间戳

  • 使用time()函数即可获取时间戳,此函数需要任何的参数,直接返回当前日期和时间

获取当前的日期和时间

  • 使用date()函数返回当前日期
  • 如果使用参数”U”,则可返回当前时间的UNIX时间戳。如果使用参数”d”,则可直接返回当前的月份的日期(范围为01~31)等等,其它更多参数可以查阅PHP手册。

使用时间戳获取日期信息

  • data()函数
    • 语法:string date(string format,[时间戳整数])
    • 此函数主要将一个UNIX时间戳转化为指定的时间/日期格式。此函数会返回一个字符串。该字符串就是一个指定格式的日期时间,其format是一个字符串,用来指定输出的时间格式。时间戳整数可以为空,如果为空,则表示为当前的UNIX时间戳
    • format参数是由指定的字符构成的,具体的字符含义可以查阅PHP手册
    • 例如:
      date("Y年m月d日 H点i分s秒 l",time());
      输出结果为:2020年03月26日 15点05分48秒 星期四
      //在此之前应先设置为自己所在时区再使用date函数
  • getdate()函数
    • 语法:array getdate(时间戳整数)
    • 此函数返回一个数组,包含日期和时间各个部分。如果它的参数时间戳整数位空,则表示直接获取当前时间戳。
    • 返回的数组的下标有year、mon等,例$arrtime[“year”]则存储的是年,具体详细可以查询PHP手册

检验日期的有效性

  • 使用用户输入的时间数据时,有时会由于用户输入的数据不规范,导致程序运行出错。为检查时间的合法有效性,需要使用checkdate()函数对输入日期进行检测
  • 语法格式:checkdate(月份,日期,年份)
  • 此函数检测的项目是:年份整数是否在0~32767之间;;月份整数是否在1~12之间;日期整数是否在相应的月份天数内

输出格式化时间戳的日期和时间

  • 使用strftime()函数可以把时间戳格式化日期和时间
  • 语法格式:strftime(格式,时间戳)
  • 其中格式有%a、%b、%c等,它们分别表示周日期(缩简)、月份(缩简)、标准格式的日期和时间,详细的格式代码含义可以查阅PHP手册
  • 例如
    echo (strftime("%b %d %Y %X",mktime(20,0,0,12,31,98)));
    输出结果为:Dec 31 1998 20:00:00

显示本地化的日期和时间

  • 由于世界上有不同的显示习惯和规范,所以日期和实际也会根据不同的地区显示为不同的形式,这就是日期时间的本地化显示
  • 实现此操作需要使用到setlocale()函数和strftime()函数
    • strftime()函数已经介绍,不再赘述
    • setlocale(目录,本地化值)
      • 此函数改变PHP本地化默认值,实现本地化的设置
      • 本地化值是一个字符串,它有一个标准的格式:language_COUNTRY.chareacterset。例如想把本地化设为美国,按照此格式为en_US.utf8;如果想把本地化设为中国,且为简体中文,按照此格式为zh_CN.gb2312,或者为zh_CN.utf8
      • 目录是指6个不用的本地化目录,由于要对日期和实际进行本地化设置,需要使用到的目录是LC_TIME
        • LC_ALL:为后面其他的目录设定本地化规则的目录
        • LC_COLLATE:字符串对比目录
        • LC_CTYPE:字母划类和规则
        • LC_MONETARY:货币表示规则
        • LC_NUMERIC:数字表示规则
        • LC_TIME:日期和时间表示规则
    • 范例
      date_default_timezone_set("Asia/Hong_Kong");
      setlocale(LC_TIME,"zh_CN.gb2312");
      echo strftime("%x");

将日期和时间解析为UNIX时间戳

  • mktime(小时,分钟,秒,月份,日期,年份)

日期时间在PHP和MySQL数据格式之间的转换

  • 日期和时间在MySQL中是安装ISO8601格式储存的。这种格式要求以年份打头,如2020-03-26这种格式。从MySQL读取的默认格式也是这种格式,对于中国人来说这种格式是比较熟悉的,不需要转换就可以进行使用
  • 在西方的表达方法中,经常把年份放在月份和日期的后面,如March 26,2020,。所以,在接触到国际的特别是符合英语使用习惯的项目时,需要对ISO8601格式的日期时间做合适的转换
  • 不过为了解决英文使用习惯和ISO8601格式冲突的问题,MySQL提供了英文使用习惯的日期和实际转换为符合ISO8601标准的两个函数,它们是DATE_FORMAT()和UNIX_TIMESTAMP()。这两个函数的具体用法属于MySQL知识,在此不再赘述

Some Tips

  • 如果需要微秒单位可以使用microtime(true)获得精确到小数点后4位的时间戳
    例如:
    $timestamp=microtime(true);
    echo $timestamp;
  • 如果定义日期和时间时出现警告(date(): It is not safe to rely on the system’s timezone settings),这是因为PHP所取的时间时格林尼治标准时间,与本地的时间会有出入,只需要按照上述方法把时区设置为本地时区即可

人已赞赏
PHP编程语言

【PHP学习笔记(五)】PHP与Web页面的交互

2020-3-25 22:55:13

PHP编程语言

【PHP学习笔记(七)】面向对象编程

2020-3-29 16:19:16

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索