首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PHP时间函数总结

PHP时间函数总结

作者头像
老高的技术博客
发布于 2022-12-27 13:21:04
发布于 2022-12-27 13:21:04
2.6K00
代码可运行
举报
运行总次数:0
代码可运行

PHP关于时间的函数可以参考这里,可以看到PHP已经提供了很多函数以供我们使用,熟练掌握这些函数可以让你摆脱冗长复杂的计算,希望本文能够让你事半功倍!

ps.关于时间戳与日期的转换工具,博主推荐这个时间戳转换工具

[TOC]

PHP时区设置

在使用PHP与时间有关的时间函数时,一定要先定义时区,否则每次使用时间函数的时候会显示一个Notice级别的错误。

本文中所有的示例都基于中国时间,即GTM+8

固化在文件

再php.ini配置文件里找到被注释掉的

;data.timezone =

改为:

date.timezone = PRC

其中PRC可以换为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Asia/Shanghai – 上海
Asia/Chongqing – 重庆
Asia/Urumqi – 乌鲁木齐
Asia/Hong_Kong – 香港
Asia/Macao – 澳门
Asia/Taipei – 台北
Asia/Singapore – 新加坡

运行时定义时区

方法一

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ini_set('date.timezone','Asia/Shanghai');

方法二

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
date_default_timezone_set('PRC'); 
//此函数PHP4不存在,考虑到兼容性可以先使用下面的方法用来判断函数是否可用
function_exists(date_default_timezone_set)

时间戳

什么是时间戳(timestamp)?他指的是格林威治时间 1970 年 1 月 1 日 00:00:00到当前时间的秒数,也称Unix时间戳(Unix timestamp)或时间戳。

time

time()函数应该是最简单的时间函数了,该函数不接受参数,返回的是当前时间的时间戳。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo time();
//1410174652

microtime

这个函数与time()类似,他返回当前时间戳以及微秒数,用空格隔开。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo microtime();
//0.55958200 1410174780

为了计算时间,一般会把该函数封装。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

mktime

根据参数生成对应的时间戳

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )

例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo mktime(0, 0, 0, 3, 27, 1990);
//638467200
//1990-3-27 00:00:00

下面几种情况值得注意:

小时,分钟和秒

以小时为例,小时的范围应该是0-23,但是如果超过这个范围,会发生什么?请读者结合示例代码自己总结。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo mktime(28, 0, 0, 3, 27, 1990);
//638568000
//1990-3-28 04:00:00

echo mktime(-28, 0, 0, 3, 27, 1990);
//638366400
//1990-3-25 20:00:00

月,日和年

以日为例,其范围应该是1-31,有几个特殊情况需要注意。请看下面示例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo mktime(0, 0, 0, 3, 1, 1990);
//1990-3-01 00:00:00

echo mktime(0, 0, 0, 3, 0, 1990);
//636134400
//1990-2-28 00:00:00
//1变为0,日期提前了一天。

//利用这个特性,我们可以轻易的得出当月的最后一天的日期
echo mktime(0, 0, 0, 4, 0, 1990);
//638812800
//1990-3-31 00:00:00

//也能轻易得出给定月份的天数
echo date( "t", mktime( 0, 0, 0, 2, 1, 2000 ) );
//29

格式化

date

这个函数的作用是把时间戳格式化为指定格式,接受两个参数,第一个为格式,具体写法请参考官方说明,第二个为时间戳,默认为当前时间,即time()

下面的例子可以得到明天,上个月和下一年。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$tomorrow  = mktime(0, 0, 0, date("m")  , date("d")+1, date("Y"));
$lastmonth = mktime(0, 0, 0, date("m")-1, date("d"),   date("Y"));
$nextyear  = mktime(0, 0, 0, date("m"),   date("d"),   date("Y")+1);

strtotime

将任何英文文本的日期时间描述解析为Unix时间戳,这是一个很强大的函数!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int strtotime ( string $time [, int $now = time() ] )

参数1:日期/时间字符串。 参数2:用来计算返回值的时间戳。

注意年月日的顺序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo date('Y-m-d', strtotime("06/08/2014")), "\n"; 
//2014-06-08

echo date('Y-m-d', strtotime("06-08-2014")), "\n"; 
//2014-08-06

strtotime可以'理解'一些自然语句,十分好用!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo strtotime("2014-03-27"), "\n";
echo strtotime("December 31"), "\n";
echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("Saturday"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";

还可以指定日期

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$time = date('Y-m-d H:i:s', time());
echo strtotime($time.'1day'), "\n";
echo "\n";
echo strtotime($time.'-1year'), "\n";
//也可以直接使用时间戳
echo strtotime('-1year', time());, "\n";
strtotime("+1 week", $startdate);

星期数相关

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//获取指定星期数的第一天,参数格式yyyyWww
//最后两个ww指你需要的周数
echo date('Y-m-d H:i:s',strtotime('2014W01')), "\n";
//2014年第一周的第一天
//2013-12-30 00:00:00

//获取指定星期数的第N天,参数格式yyyyWww-N。N的取值范围是1-7
echo date('Y-m-d H:i:s',strtotime('2014W01-5')), "\n";
//2014年第一周的第五天
//2014-01-03 00:00:00

DateTime类

这里是DateTime类文档链接

DateTime类实现了DateTimeInterface接口,它实现了很多关于时间的功能,如时间的比较、修改、创建和格式化等。 创建一个DateTime对象很简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$datetime = new DateTime;  //面向对象
$datetime_specific = new DateTime('2014-03-27'); //面向对象

其主要方法包括:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$datetime->add();            //增加时间
$datetime->sub();            //减少时间
$datetime->modify();         //修改时间
$datetime->format();         //格式化输出
$datetime->setTime();        //设置时间
$datetime->diff();          //对比时间,返回时间差

以上方法在此不展开讲了,有兴趣TX请自己上面的文档学习。

DateInterval类

DateInterval类表示一个时间段,这个类在DateTime的add()sub()还有diff()中会用到,其构造函数里需要传入时间增量

什么是时间增量?

他用来描述一段时间,形如P1Y2M3DT4H5M6S,字母都是大写。其中P后面跟年月日,T后面是时分秒。例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
P1YT1S      1年零一秒
T1H1S       1小时零一秒

理解了时间增量,那么我们来构造一个DateInterval对象吧:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$eightynine_days_ago = new DateInterval( "P89D" ); 

接下来就可以把他们用在DateTime的add()sub()还有diff()中了。

localtime

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array localtime ([ int $timestamp = time() [, bool $is_associative = false ]] )

localtime以时间戳为准,返回一个数组,其结构和 C 函数调用返回的完全一样。

例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print_r( localtime(strtotime('2014-03-27 12:13:14')) );

Array
(
    [0] => 14
    [1] => 13
    [2] => 12
    [3] => 27
    [4] => 2
    [5] => 114
    [6] => 4
    [7] => 85
    [8] => 0
)

如果第二参数为真,则返回一个关联数组,与之前的索引数组对应。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print_r( localtime(strtotime('2014-03-27 12:13:14'), true) );

Array
(
    [tm_sec] => 14
    [tm_min] => 13
    [tm_hour] => 12
    [tm_mday] => 27
    [tm_mon] => 2
    [tm_year] => 114
    [tm_wday] => 4
    [tm_yday] => 85
    [tm_isdst] => 0
)

说明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"tm_sec" - 秒数, 059
"tm_min" - 分钟数, 059
"tm_hour" - 小时, 023
"tm_mday" - 月份中的第几日, 131
"tm_mon" - 年份中的第几个月, 0 (Jan)11 (Dec)
"tm_year" - 年份,从 1900 开始
"tm_wday" - 星期中的第几天, 0 (Sun)6 (Sat)
"tm_yday" - 一年中的第几天, 0365
"tm_isdst" - 夏令时当前是否生效? 如果是生效的是正数, 0 代表未生效,负数代表未知。

日历Calender函数

文档在这儿

老高觉得这Calender函数中最有用的就是这个cal_days_in_month了,他返回某个历法中某年中某月的天数。

例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo cal_days_in_month(CAL_GREGORIAN, 2, 2014);
//28

比之前mktime()要简单的多吧。

总结

关于时间的函数就介绍到这儿,由于老高时间有限,许多有趣的函数,如checkdatedate_diff都没有铺开介绍,争取日后补上。

纵观PHP在5.0版本的时间函数,不难发现,PHP为我们提供了一套很简单快捷的函数帮助我们处理时间,而且很多计算的方法不止一种,希望大家掌握本文提供的最基础的函数,然后运用到实际的开发中去。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
06-SpringCloud Eureka
Spring Cloud封装了Netflix 公司开发的Eureka模块来实现服务治理
彼岸舞
2021/08/24
4190
Spring Cloud 系列之注册中心 Eureka
  Netflix Eureka 是由 Netflix 开源的一款基于 REST 的服务发现组件,包括 Eureka Server 及 Eureka Client。2012 年 9 月在 GitHub 上发布 1.1.2 版本,目前 Netflix 以宣布闭源,所以市面上还是以 1.x 版本为主。Eureka 提供基于 REST 的服务,在集群中主要用于服务管理。Eureka 提供了基于 Java 语言的客户端组件,客户端组件实现了负载均衡的功能,为业务组件的集群部署创造了条件。使用该框架,可以将业务组件注册到 Eureka 容器中,这些组件可进行集群部署,Eureka 主要维护这些服务的列表并自动检查它们的状态。Spring Cloud Netflix Eureka 是 Pivotal 公司为了将 Netflix Eureka 整合于 Spring Cloud 生态系统提供的版本。   Eureka 包含两个组件:Eureka Server 和 Eureka Client, Eureka Server 提供服务注册服务。各个微服务节点通过配置启动后,会在 EurekaServer 中进行注册,这样 EurekaServer 中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。EurekaClient 通过注册中心进行访问。它是一个 Java 客户端,用于简化 Eureka Server 的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向 Eureka Server 发送心跳(默认周期为30秒)。如果 Eureka Server 在多个心跳周期内没有接收到某个节点的心跳,EurekaServer 将会从服务注册表中把这个服务节点移除(默认90秒)
Demo_Null
2020/11/04
3850
Spring Cloud 系列之注册中心 Eureka
微服务(三)——Eureka服务注册与发现&Eureka集群
Spring Cloud封装了Netflix 公司开发的Eureka模块来实现服务治理
不愿意做鱼的小鲸鱼
2022/09/26
9020
微服务(三)——Eureka服务注册与发现&Eureka集群
Eureka
Eureka 是AP服务, 无 master/slave 之分,每一个 Peer 都是对等的。只要有一台Eureka还在,就能保证注册服务可用, 只不过每个Server的注册表信息可能不一致。为了保障注册中心的高可用性,容忍了数据的非强一致性。在集群环境中如果某台 EurekaServer 宕机,EurekaClient 的请求会自动切换到新的 EurekaServer 节点上,服务提供者有多个时,Eureka Client 客户端会通过 Ribbon 自动进行负载均衡。
莫闲得慌
2021/07/20
8070
Spring Cloud Eureka
在 Eureka 注册中心的页面会看到这样的提示,说明 Eureka 进入了保护模式:
灰太狼学Java
2022/06/17
3670
了解Eureka工作原理
Eureka 作为 Spring Cloud 体系中最核心、默认的注册中心组件,研究它的运行机制,有助于我们在工作中更好地使用它。
chengcheng222e
2021/11/04
1.5K0
SpringCloud---Eureka
Spring Cloud封装了Netflix 公司开发的Eureka模块来实现服务治理
大忽悠爱学习
2021/11/15
3430
【SpringCloud】三、Eureka
传统RPC远程调用框架中,服务之间依赖关系复杂,不便于管理。所以产生了服务治理,实现服务的注册与发现。
Yuyy
2022/06/28
3760
【SpringCloud】三、Eureka
SpringCloud-微服务的注册与发现Eureka(二)
一、SpringCloud简介   Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和
2018/06/27
29.8K1
快速学习-Eureka注册中心
在刚才的案例中,user-service对外提供服务,需要对外暴露自己的地址。而consumer(调用者)需要记录服务提供者的地址。将来地址出现变更,还需要及时更新。这在服务较少的时候并不觉得有什么,但是在现在日益复杂的互联网环境,一个项目肯定会拆分出十几,甚至数十个微服务。此时如果还人为管理地址,不仅开发困难,将来测试、发布上线都会非常麻烦,这与DevOps的思想是背道而驰的。
cwl_java
2020/02/11
6380
Eureka 集群搭建「建议收藏」
在实际的生产环境中,eureka 常常是以集群的方式提供服务的,目的就是要保证高可用性,同时它还保证了分区容错性。这也满足了一个健壮的分布式系统所要求的 CAP 理论原则,即 eureka 保证了高可用性,分区容错性。
全栈程序员站长
2022/07/01
1.7K0
Eureka 集群搭建「建议收藏」
微服务架构下的服务治理:在 SpringCloud 框架中实现服务的注册与发现
服务治理 RPC远程过程调用协议的核心设计思想: 在于注册中心, 因为注册中心:管理每个服务与服务之间的一个依赖关系 服务治理: 在传统的RPC远程过程调用协议中,管理每个服务与服务之间的依赖关系非常复杂.可以使用服务治理技术,管理每个服务与服务之间的一个依赖关系.可以实现本地负载均衡,服务发现与注册,容错等 服务注册与发现 注册中心 在RPC远程过程调用协议中,有一个注册中心 SpringCloud支持三种组册中心: Consul(go语言) Eureka Zookeeper Dubbo支持两种注册中心:
攻城狮Chova
2021/08/17
8660
微服务架构下的服务治理:在 SpringCloud 框架中实现服务的注册与发现
SpringCloud入门系列之Eureka注册中心
Eureka Register Service(注册中心服务端)、Provider Service(服务提供者,客户端)、Consumer Service(服务消费者,客户端)
AI码真香
2022/09/13
3020
Eureka服务注册与发现(概念原理篇)
过去,每个应用都是一个CPU,一个主机上的单一系统。然而今天,随着大数据和云计算时代的到来,任何独立的程序都可以运行在多个计算机上。并且随着业务的发展,访问用户量的增加,开发人员或小组的增加,系统会被拆分成多个功能模块。拆分后每个功能模块可以作为一个独立的子系统提供其职责范围内的功能。而多个子系统中,由于职责不同并且会存在相互调用,同时可能每个子系统还需要多个实例部署在多台服务器或者镜像中,导致了子系统间的相互调用形成了一个错综复杂的网状结构。用几幅图说明一下:
Bug开发工程师
2019/05/04
3.1K0
eureka手动注册服务_istio服务注册与发现
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
全栈程序员站长
2022/09/24
2.9K0
eureka手动注册服务_istio服务注册与发现
【愚公系列】2023年11月 Java教学课程 184-SpringCloud(Eureka注册中心)
微服务注册中心是一个管理微服务的工具,可以帮助微服务在分布式系统中发现、注册和协调服务之间的交互。它是微服务架构的核心组件之一,负责维护服务注册表,提供服务发现、负载均衡、故障恢复等功能,使得微服务能够更好地运行和协作。常见的微服务注册中心有Consul、Eureka、Zookeeper等。
愚公搬代码
2025/06/02
880
【愚公系列】2023年11月 Java教学课程 184-SpringCloud(Eureka注册中心)
Eureka集群原理
高可用,试想你的注册中心只有一个only one,它出故障了那就呵呵o( ̄︶ ̄)o了,会导致整个微服务环境不可用。
全栈程序员站长
2022/09/03
7480
Eureka集群原理
SpringCloud服务注册与发现之Eureka
在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。 它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。一句话讲解:好死不如赖活着 综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留)也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。
cheese
2023/10/25
5620
SpringCloud服务注册与发现之Eureka
springcloud2-注册中心eureka及nacos
1,课程回顾 2,本章重点 eureka注册中心 nacos注册中心 3,具体内容
张哥编程
2024/12/13
1780
springcloud2-注册中心eureka及nacos
nacos和eureka的区别 面试_nacos和eureka比较哪个好
1.服务注册(register):Eureka Client会通过发送REST请求的方式,向Eureka Server注册自己的服务。注册时,提供自身的元数据,比如ip地址、端口、运行状况指标、主页地址等信息。Eureka Server接收到注册请求后,就会把这些元数据信息存储在一个双层的Map中。 什么时候注册?在启动微服务的时候。
全栈程序员站长
2022/09/24
1.3K0
nacos和eureka的区别 面试_nacos和eureka比较哪个好
相关推荐
06-SpringCloud Eureka
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验