[nesbot/carbon]轻松优雅的驾驭时间处理

news2024/11/25 6:56:01

简介

这个库的名字其实就很有意思:“carbon”,是化学元素的名字“碳”,为什么叫这个名字呢?在科学界,有一个"放射性碳定年法"的东西,是一种利用碳的同位素14C的放射性来对含有有机物质的物品进行年代测定的方法。从这意义上讲,他是要处理时间的。

我们在开发中,经常需要处理时间的格式化显示。比如计算两个时间差多长时间,明天的时间,本周的时间,以及人性化的输出“几天前”时间变化,这时候我们可能会手忙脚乱的去网上复制代码,最后搞得代码乱糟糟的。

但实际上,这些用这一个库都能实现:

实例

安装

composer require nesbot/carbon

精简却全面的案例

<?php
$date = Carbon::now()->locale('zh_CN');
echo "\n";
echo $date->locale();            
echo "\n";
echo $date->diffForHumans('2023-08-13');     
echo "\n";
echo $date->monthName;           
echo "\n";
echo $date->isoFormat('LLLL');

输出如下:

2023年4月28日星期五早上8点03分zh_CN
3个月前
四月
2023年4月28日星期五早上8点03分

在上面的例子中,几乎没有任何逻辑代码,只是通过静态方法创建了一个对象,然后调用输出就可以。

在上面,我们创建了当前时间,按照本地化输出时间,同时对比一下相较于给定的时间还差多久,输出一下月份。

多种设置时间的方式

carbon支持各种方式去设置具体的时间,有时候我们接收到的日期并不完整,此时可以用它做一个统一的处理,免得在不同数据库之间的默认行为产生兼容性问题。

$dt = Carbon::now();

$dt->year(1975)->month(5)->day(21)->hour(22)->minute(32)->second(5)->toDateTimeString();
$dt->setDate(1975, 5, 21)->setTime(22, 32, 5)->toDateTimeString();
$dt->setDate(1975, 5, 21)->setTimeFromTimeString('22:32:05')->toDateTimeString();
$dt->setDateTime(1975, 5, 21, 22, 32, 5)->toDateTimeString();

// All allow microsecond as optional argument
$dt->year(1975)->month(5)->day(21)->hour(22)->minute(32)->second(5)->microsecond(123456)->toDateTimeString();
$dt->setDate(1975, 5, 21)->setTime(22, 32, 5, 123456)->toDateTimeString();
$dt->setDate(1975, 5, 21)->setTimeFromTimeString('22:32:05.123456')->toDateTimeString();
$dt->setDateTime(1975, 5, 21, 22, 32, 5, 123456)->toDateTimeString();

$dt->timestamp(169957925); // Note: timestamps are UTC but do not change the date timezone

$dt->timezone('Europe/London')->tz('America/Toronto')->setTimezone('America/Vancouver');

轻松地获取到时间周期

我们会经常去获取开始时间爱你和结束时间,比如一天的开始时间和结束时间,本周的开始时间和结束时间,今年的开始时间和结束时间,现在用它几乎不需要任何处理,直接调用内置方法就够了。

$dt = new Carbon('2012-01-31 15:32:45.654321');
echo $dt->startOfSecond()->format('s.u');          // 45.000000


$dt = new Carbon('2012-01-31 15:32:45.654321');
echo $dt->endOfSecond()->format('s.u');            // 45.999999

$dt = new Carbon('2012-01-31 15:32:45.654321');
echo $dt->startOf('second')->format('s.u');        // 45.000000

$dt = new Carbon('2012-01-31 15:32:45.654321');
echo $dt->endOf('second')->format('s.u');          // 45.999999
// ->startOf() and ->endOf() are dynamic equivalents to those methods

$dt = Carbon::create(2012, 1, 31, 15, 32, 45);
echo $dt->startOfMinute();                         // 2012-01-31 15:32:00

$dt = Carbon::create(2012, 1, 31, 15, 32, 45);
echo $dt->endOfMinute();                           // 2012-01-31 15:32:59

$dt = Carbon::create(2012, 1, 31, 15, 32, 45);
echo $dt->startOfHour();                           // 2012-01-31 15:00:00

$dt = Carbon::create(2012, 1, 31, 15, 32, 45);
echo $dt->endOfHour();                             // 2012-01-31 15:59:59

$dt = Carbon::create(2012, 1, 31, 15, 32, 45);
echo Carbon::getMidDayAt();                        // 12
echo $dt->midDay();                                // 2012-01-31 12:00:00
Carbon::setMidDayAt(13);
echo Carbon::getMidDayAt();                        // 13
echo $dt->midDay();                                // 2012-01-31 13:00:00
Carbon::setMidDayAt(12);

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfDay();                            // 2012-01-31 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfDay();                              // 2012-01-31 23:59:59

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfMonth();                          // 2012-01-01 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfMonth();                            // 2012-01-31 23:59:59

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfYear();                           // 2012-01-01 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfYear();                             // 2012-12-31 23:59:59

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfDecade();                         // 2010-01-01 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfDecade();                           // 2019-12-31 23:59:59

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfCentury();                        // 2001-01-01 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfCentury();                          // 2100-12-31 23:59:59

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfWeek();                           // 2012-01-30 00:00:00
var_dump($dt->dayOfWeek == Carbon::MONDAY);        // bool(true) : ISO8601 week starts on Monday

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfWeek();                             // 2012-02-05 23:59:59
var_dump($dt->dayOfWeek == Carbon::SUNDAY);        // bool(true) : ISO8601 week ends on Sunday

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->next(Carbon::WEDNESDAY);                 // 2012-02-01 00:00:00
var_dump($dt->dayOfWeek == Carbon::WEDNESDAY);     // bool(true)
echo $dt->next('Wednesday');                       // 2012-02-08 00:00:00
echo $dt->next('04:00');                           // 2012-02-08 04:00:00
echo $dt->next('12:00');                           // 2012-02-08 12:00:00
echo $dt->next('04:00');                           // 2012-02-09 04:00:00

$dt = Carbon::create(2012, 1, 1, 12, 0, 0);
echo $dt->next();                                  // 2012-01-08 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->previous(Carbon::WEDNESDAY);             // 2012-01-25 00:00:00
var_dump($dt->dayOfWeek == Carbon::WEDNESDAY);     // bool(true)

$dt = Carbon::create(2012, 1, 1, 12, 0, 0);
echo $dt->previous();                              // 2011-12-25 00:00:00

$start = Carbon::create(2014, 1, 1, 0, 0, 0);
$end = Carbon::create(2014, 1, 30, 0, 0, 0);
echo $start->average($end);                        // 2014-01-15 12:00:00

echo Carbon::create(2014, 5, 30, 0, 0, 0)->firstOfMonth();                       // 2014-05-01 00:00:00
echo Carbon::create(2014, 5, 30, 0, 0, 0)->firstOfMonth(Carbon::MONDAY);         // 2014-05-05 00:00:00
echo Carbon::create(2014, 5, 30, 0, 0, 0)->lastOfMonth();                        // 2014-05-31 00:00:00
echo Carbon::create(2014, 5, 30, 0, 0, 0)->lastOfMonth(Carbon::TUESDAY);         // 2014-05-27 00:00:00
echo Carbon::create(2014, 5, 30, 0, 0, 0)->nthOfMonth(2, Carbon::SATURDAY);      // 2014-05-10 00:00:00

echo Carbon::create(2014, 5, 30, 0, 0, 0)->firstOfQuarter();                     // 2014-04-01 00:00:00
echo Carbon::create(2014, 5, 30, 0, 0, 0)->firstOfQuarter(Carbon::MONDAY);       // 2014-04-07 00:00:00
echo Carbon::create(2014, 5, 30, 0, 0, 0)->lastOfQuarter();                      // 2014-06-30 00:00:00
echo Carbon::create(2014, 5, 30, 0, 0, 0)->lastOfQuarter(Carbon::TUESDAY);       // 2014-06-24 00:00:00
echo Carbon::create(2014, 5, 30, 0, 0, 0)->nthOfQuarter(2, Carbon::SATURDAY);    // 2014-04-12 00:00:00
echo Carbon::create(2014, 5, 30, 0, 0, 0)->startOfQuarter();                     // 2014-04-01 00:00:00
echo Carbon::create(2014, 5, 30, 0, 0, 0)->endOfQuarter();                       // 2014-06-30 23:59:59

echo Carbon::create(2014, 5, 30, 0, 0, 0)->firstOfYear();                        // 2014-01-01 00:00:00
echo Carbon::create(2014, 5, 30, 0, 0, 0)->firstOfYear(Carbon::MONDAY);          // 2014-01-06 00:00:00
echo Carbon::create(2014, 5, 30, 0, 0, 0)->lastOfYear();                         // 2014-12-31 00:00:00
echo Carbon::create(2014, 5, 30, 0, 0, 0)->lastOfYear(Carbon::TUESDAY);          // 2014-12-30 00:00:00
echo Carbon::create(2014, 5, 30, 0, 0, 0)->nthOfYear(2, Carbon::SATURDAY);       // 2014-01-11 00:00:00

echo Carbon::create(2018, 2, 23, 0, 0, 0)->nextWeekday();                        // 2018-02-26 00:00:00
echo Carbon::create(2018, 2, 23, 0, 0, 0)->previousWeekday();                    // 2018-02-22 00:00:00
echo Carbon::create(2018, 2, 21, 0, 0, 0)->nextWeekendDay();                     // 2018-02-24 00:00:00
echo Carbon::create(2018, 2, 21, 0, 0, 0)->previousWeekendDay();                 // 2018-02-18 00:00:00

更多用法

实际上carbon还有很多的用法,比如跨时区计算实际的发生时差,按各种不同的标准输出等等。

特点

1. 易学易用:Carbon扩展了PHP的DateTime类,使其更加友好、易学。

2. 链式操作:Carbon支持链式操作,可以在一行代码中完成多个日期操作。

3. 兼容性强:由于基于PHP DateTime类,Carbon具有与PHP内置DateTime的大部分功能和兼容性,因此在很多地方都可以直接替换原生的DateTime类。

4. 多语言支持:Carbon支持多语言,可以根据需要设置日期的语言格式。

总之,nesbot/carbon是一个十分实用的日期时间处理扩展库,具有易学易用、链式操作、兼容性强、多语言支持等多个优点。它简化了PHP的日期处理代码,让开发更加高效、快捷。

原文标题:[nesbot/carbon]轻松优雅的驾驭时间处理

原文地址:https://phpreturn.com/index/a644b5fd15ec31.html

原文平台:PHP武器库

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472146.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

废物,我TMD一个985却斗不过专科生(大厂自动化测试2年被裁)

前言 看到标题&#xff0c;可能很多读者朋友恐怕又要骂我了&#xff0c;985这个特殊的字眼也确实异常晃眼&#xff0c;实际上现在985&#xff0c;211也越来越多&#xff0c;它能代表你能够进入到更高的平台&#xff0c;拿到“高级工厂”的入场券&#xff0c;但并不意味着你会成…

每天一道算法练习题--Day14 第一章 --算法专题 --- -----------大话搜索

大话搜索 搜索一般指在有限的状态空间中进行枚举&#xff0c;通过穷尽所有的可能来找到符合条件的解或者解的个数。根据搜索方式的不同&#xff0c;搜索算法可以分为 DFS&#xff0c;BFS&#xff0c;A*算法等。这里只介绍 DFS 和 BFS&#xff0c;以及发生在 DFS 上一种技巧-回…

详解八大排序算法-附动图和源码(插入,希尔,选择,堆排序,冒泡,快速,归并,计数)

目录 &#x1f34f;一.排序的概念及应用&#x1f34f; 1.排序的概念 2.排序的应用 3.常用的排序算法 &#x1f34e;二.排序算法的实现&#x1f34e; 1.插入排序 1.1直接插入排序 1.2希尔排序&#xff08;缩小增量排序&#xff09; 2.选择排序 2.1直接选择排序 2.2堆排序…

LVS负载均衡群集部署—DR直接路由

目录 一、LVS-DR模式二、LVS-DR模式的特点三、LVS-DR中的ARP问题四、LVS-DR的优点与缺点五、为什么谁知lo:0而不是ens33:0六、LVS负载均衡群集-DR模式部署1.配置nfs共享&#xff08;192.168.154.10&#xff09;2.部署第一台nginx服务&#xff08;192.168.154.11&#xff09;3.部…

常用数据可视化对比类图表大全

优秀的数据可视化从来都不是罗列数据&#xff0c;更要根据自己的数据特征&#xff0c;设计出可以被读者轻松理解的图表。 图表类型有很多&#xff0c;选择正确图表的过程可能会让人混乱。本文将为您介绍数据可视化中比较类图表&#xff0c;以完美地表示您的数据并以最有效的方…

PostgreSQL安装和开启SSL加密连接【配置双向认证】

SSL单向认证和双向认证&#xff1a; SSL单向认证&#xff1a;只有一端校验对端的证书合法性&#xff0c;通常都是客户端来校验服务器的合法性。即在一般的单向认证中&#xff0c;只要求服务器端部署了ssl证书就行&#xff0c;客户端可以无证书&#xff0c;任何用户都可以去访问…

Rasa聊天机器人控制Python Turtle

背景 为了展示Rasa聊天机器人的使用效果以及如何将Rasa应用到业务系统中(这里将Python Turtle模块作为业务系统)&#xff0c;用户将语音或者文本输入至Rasa&#xff0c;经过处理后调用Python Turtle的功能。 turtle库是Python语言中一个很流行的绘制图像的函数库&#xff0c;想…

Docker常用命令笔记

docker常用命令 1 基础命令 sudo docker version #查看docker的版本信息 sudo docker info #查看docker系统信息&#xff0c;包括镜像和容器的数量 2 镜像命令 1&#xff0e;sudo docker images #查看本地主机的所有主机镜像 #解释 **REPOSITORY **#镜像的仓库源TAG **** …

微信小程序python+nodejs+php+springboot+vue 校园餐饮点单配送系统商家 配送员

管理员的主要功能有&#xff1a; 1.管理员输入账户登陆后台 2.个人中心&#xff1a;管理员修改密码和账户信息 3.学生管理&#xff1a;对注册的学生信息进行添加&#xff0c;修改&#xff0c;删除&#xff0c;查询 4.商家管理&#xff1a;对注册的商家信息进行添加&#xff0c;…

【在线研讨会】智慧汽车时代来临 -车规功能安全软硬件一次到位

随着科技的不断发展&#xff0c;智慧汽车的时代已经到来&#xff0c;在实现智慧汽车的过程中&#xff0c;车辆的功能安全、软硬件设计等方面都面临着严峻的挑战。为了确保智慧汽车的安全性和可靠性&#xff0c;在硬件设计方面&#xff0c;需要考虑到各种可能出现的故障和安全风…

日撸 Java 三百行day39

文章目录 说明day39 关键路径1.关键路径2. 代码分析 说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护&#xff1a;https://github.com/fulisha-ok/sampledata day39 关键路…

PMP课堂模拟题目及解析(第1期)

1.在一个大型施工项目的规划阶段&#xff0c;出现了潜在的经济衰退迹象。之前关于经济衰退的风险被指定为低概率和高影响&#xff0c;预计持续 6-12 个月。项目开始后不久 发生了经济衰退&#xff0c;并按预期影响项目。六个月后&#xff0c;经济衰退影响的持续时间将更改为 24…

网络通信与密码相关概念流程

文章目录 前言一、明文通信二、密文通信1.对称加密2.非对称加密 三、安全信任机制1.CA(Certificate Authority) 证书授权中心2.数字证书 总结 前言 随着科技的发展&#xff0c;人们的通信都转化成电子通信&#xff0c;由于信息需要通过一个公有的网络进行传输&#xff0c;信息…

Spring IOC 源码解读

将回答以下问题&#xff1a; BeanFactory 和 ApplicationContext 之间的关系和区别。一个 Bean 是如何被注入到 IOC 容器里&#xff0c;中间经历了什么过程&#xff08;Bean 的生命周期&#xff09;。 先入为主 假设你已经有如下经验&#xff1a; 什么是 IOC。 don‘t call…

verilog手撕代码2——各种加法器介绍——真值表、表达式、电路图

文章目录 前言一、半加器二、全加器三、串行/行波进位加法器&#xff08;Ripple-Carry Adder/RCA&#xff09;四、超前进位加法器&#xff08;Lookahead Carry Adder/LCA&#xff09;五、进位保存加法器&#xff08;Carry Save Adder/CSA&#xff09; 前言 2023.4.25 一、半加…

Terraform

文章目录 简介安装简单使用案例 概念原理状态管理Backend 远程状态存储机制 配置语法Argument 参数Block 块terraform块required_providersbackend provider块: 与基础设施交互resource块: 定义基础架构data块: 数据源 表达式(Experssion)和函数(Functions)变量variable 输入变…

【Celery】任务Failure或一直超时Pending

编写背景 task进入队列后&#xff0c;部分任务出现Failure或者一直Pending,且业务代码没有报错。 运行环境 celery配置 from celery import Celery broker redis://:127.0.0.1:6379/1 backend redis://:127.0.0.1:6379/2 app Celery(brokerbroker,backendbackend,includ…

【文心一言】广告文案、演讲稿与请假条自动生成

前言 作为一名大学生而言&#xff0c;平时参加或者举办一些学校组织的活动的时候&#xff0c;总是避免不了需要准备一些演讲稿、广告宣传文案等内容&#xff0c;甚至于在疫情十分严重的这几年内&#xff0c;如何跟老师“委婉的”请假&#xff0c;也成为了我日常头疼的事情。但在…

React之redux的模板

文章目录 以下为模板代码安装(添加 Redux Toolkit 和 React-Redux 依赖包到你的项目中)以下为项目目录在store/index.js里面的模板创建模块(模块化思想),这里就是模板,所有模块通用(src/features/userSlice.js)在main.jsx引入模板(只需要看下面画横线的四行)在组件内使用 以下是…

【网课平台】Day16.项目优化:压测、加缓存优化与分布式锁

文章目录 一、压力测试1、优化需求2、性能指标3、安装Jmeter4、压力测试5、优化日志 二、缓存优化1、给接口加Redis缓存2、缓存穿透3、解决缓存穿透4、缓存雪崩5、缓存击穿 三、分布式锁1、本地锁的问题2、IDEA一个项目启动多个实例3、分布式锁4、Redis NX实现分布式锁5、Redis…