PHP:逃离日期地狱的实用方法

企业的关键功能通常依赖于日期,例如订阅、定期付款或预订。

作为一名 php 程序员,您可能需要操作日期/时间。

开始使用第三方库?真的吗?

虽然坚持使用本机 api 来掌握技能并了解语言的工作原理通常是一个很好的做法,但让我们务实一些。

carbon 是一个功能强大的库,它扩展了 datetimeinterface、jsonserialized 和其他原生 php 工具。

它为操作现有和新的日期对象提供了有用的帮助器:

// tomorrowcarbonimmutable::now()->add(1, 'day');// copy instance from another api$datetime = new datetime('first day of january 2025');$carbon = carbon::instance($datetime);// parsing values$date = carbon::parse('2050-01-01 12:34:00', 'utc');

回到基础

carbon 扩展了原生 api,但 datetime 对象已经提供了计算日期和时间的工具:

$date = new datetime('2024-07-23');$date->add(new dateinterval('p10d'));echo $date->format('y-m-d');$date2 = new datetime('2024-08-03');$interval = $date->diff($date2);echo $interval->format('%r%a days');

您可以传递字符串来获取特定输出或计算间隔和周期。

立即学习“PHP免费学习笔记(深入)”;

那么,为什么要使用碳等附加层呢?

更好的可读性

$yesterday = carbon::yesterday();$today = carbon::today();$now = carbon::now();$tomorrow = carbon::tomorrow();$futuredate = carbon::today()->adddays(21)->format('y-m-d');if ($now->isendofday()) {    // some code}

该库对于日期比较来说方便且强大,但很容易出现各种错误。

轻松本地化

carbon 可以方便地处理语言环境:

$now = carbon::now()->locale('fr_fr');echo $now->monthname;

处理溢出

默认的 php datetime 行为在添加或减去月份时可能会产生误导。它可以溢出!

虽然您有时可能需要这种行为,但 carbon 提供了更好的控制:

carbon::usemonthsoverflow(false);carbon::resetmonthsoverflow();

您还可以在操作年或月时在每个方法中配置溢出(例如,submonthsnooverflow、addmonthswithoverflow)。

单元测试日期

由于可变性,日期在单元测试中可能会出现问题。

carbon 提供了先进的模拟功能,确保测试保持一致和可靠。

这可以防止随机错误破坏 ci/cd 管道。

如何避免日期/时间的常见陷阱

无论您是否使用 carbon,都有一些实用的方法可以减少潜在的错误和不一致:

不要消除错误

php 的最新版本引入了更好的日期/时间异常,使您能够更一致地捕获意外输入。

但是,实现有时可以消除严重错误:

$dateinput = '2dsds';$timestamp = strtotime($dateinput);echo date('y-m-d', $timestamp); // defaults back to 1970-01-01

以下代码并不是改进,即使它使用 datetime 对象:

$dateinput = '2024-02-30'; // invalid date (february has 28 days, 29 at most)$date = new datetime($dateinput);echo $date->format('l the js f'); // outputs "friday the 1st march"

所以,始终验证日期/时间:

$dateinput = '2dsds';$timestamp = strtotime($dateinput);if (false === $timestamp) {    throw new invalidargumentexception();}echo date('y-m-d', $timestamp);

并且,深入检查输入:

$format = 'Y-m-d';$dateInput = '2024-02-30';$dateInfo = date_parse($dateInput);if (!checkdate($dateInfo['day'], $dateInfo['month'], $dateInfo['year'])) {    throw new InvalidArgumentException();}$date = DateTimeImmutable::createFromFormat($format, $dateInput);echo $date->format('l the jS F');

防止意外突变

datetimeimmutable 或 carbonimmutable 创建后无法更改。大多数时候,您不需要改变初始日期。

如果代码的其他部分依赖于该实例,则可能会引入严重的错误。

不可变格式可以防止此类副作用,并且通常更有利于可读性和测试。

不要忽视时区

忽视时区是有风险的:

如果您未在应用中指定默认时区,则服务器将确定它。

但是,您的应用程序可能部署在不同时区的服务器上。

您可能还会遇到夏令时或存储格式(例如,utc 与当地时间)等复杂问题,而对于鼓励良好实践的库来说,这可能会减轻一些痛苦。

包起来

原生 api 允许对日期和时间进行高级操作,而 carbon 则对其进行了精美的扩展。

php 开发人员可以利用这个附加层来简化计算并提高可读性。

无论您是否使用它,请确保您了解本机 php datetime 对象的默认行为。

以上就是PHP:逃离日期地狱的实用方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1249743.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月9日 21:37:09
下一篇 2025年12月9日 20:02:48

相关推荐

  • 想快速上手PHP开发?有哪些核心技术和学习资源推荐?

    关于PHP的核心技术与学习资料 PHP是一门广泛使用的开源服务器端脚本语言。它以其核心技术奠定了强大的基础: 面向对象编程: PHP支持面向对象的编程范式,允许开发人员创建可重用和可维护的代码。动态类型: PHP变量无需显式声明类型,使得代码更加灵活和简洁。大量的库和框架: PHP拥有丰富的库和框架…

    2025年12月9日
    000
  • phpini 概述:提高性能、安全性和灵活性

    目录 php.ini简介 什么是 php.ini?为什么它很重要? php.ini 的关键方面 错误处理资源限制安全设置会话管理时区配置文件上传限制 php.ini 如何影响 PHP 性能 内存和执行限制缓存机制开发与生产中的错误处理 为什么 php.ini 对于 PHP 开发很重要 立即学习“PH…

    2025年12月9日
    000
  • 如何从数据库中获取数据并以 PHP 形式形成?

    要从 PHP 数据库中获取数据并将其显示在表单中,通常需要执行以下步骤:1.连接到数据库:使用 MySQLi 或 PDO 建立到数据库的连接。2.查询数据库:执行SQL查询以检索所需的数据。3.获取数据:从查询结果中获取数据。4.填充表单:使用获取的数据填写表单字段。 这是一个使用的简单示例MySQ…

    2025年12月9日
    000
  • 一点灾难,一大动力:构建 CLI Secret Manager

    那么,让我们来谈谈一个变成重大动机的小不幸。我刚从盒子里拿出来的闪亮新 macbook pro m3 在例行软件更新后决定将自己变砖。 提示戏剧性的音乐。随之而来的是我所有宝贵的数据,包括那些讨厌的秘密,如 api 密钥、ssh 密钥和个人 shell 脚本。最糟糕的部分?距离关键的生产部署只有两天…

    2025年12月9日
    000
  • PHP 的新功能

    php 8.4:新增功能以及如何使用它 php 8.4 现已推出,带来了一些令人兴奋的功能,可以简化编码并提高性能。本文通过简单的示例解释了最重要的更新,使各种技能水平的开发人员都能轻松理解和使用这些功能。 1. 属性挂钩 属性挂钩可让您自定义获取或设置属性时发生的情况。这消除了对单独的 gette…

    2025年12月9日
    000
  • 为什么使用 POST 进行更新比超链接更安全

    在 php 中更新记录时,选择使用 执行操作(通常通过表单和 http 方法,如 post 或 put)还是 超链接(通常使用 get 方法)归结为安全性和最佳实践。这就是为什么执行操作是首选: 安全 get(超链接): 由链接触发的操作通常使用 get http 方法,该方法旨在检索信息,而不是修…

    2025年12月9日
    000
  • (我的第一次)安装 Laravel

    有时,尤其是当您刚刚开始职业生涯时,您似乎遵循了指示却一事无成 – 而其他人似乎发现这非常容易。 这可能非常令人沮丧,我想描述一下即使在几十年之后我也经历完全相同的事情的几种方式。所以我在这里,试图详细描述我在努力让事情顺利进行时所犯的错误和失误。这是我关于这个主题的第一篇文章,但我希望…

    2025年12月9日
    000
  • php怎么去掉多余的标签

    本文针对 PHP 开发人员提供了一种高效的方法来移除不必要的 HTML 标签。通过利用内置的 DOMDocument 类和相应的 XPath 表达式,你可以轻松识别和删除多余的元素,从而优化你的 HTML 代码库,提升网页的性能和加载速度。 1. 确定要删除的标签 1.1 手动检查 检查 HTML …

    2025年12月9日
    000
  • 要避免的 fetch() 和 XMLHttp 错误

    可悲的是,我没有避免这些错误。我希望这可以帮助其他人在尝试更新网页而不完全下载新版本时避免它们。我最终得到的代码似乎有效: async function fetchdbsingle(url, str) { const datatosend = str; console.log(‘fetchdbsin…

    2025年12月9日
    000
  • 如何在 Laravel 中处理大型数据集而不耗尽内存

    如何在 laravel 中处理大型数据集而不耗尽内存 在 laravel 中处理大量数据时,经常会遇到应用程序内存不足等问题。当尝试一次将数千(甚至数百万)条记录加载到内存中时,可能会发生这种情况。然而,laravel 提供了一些有用的方法来帮助您以较小的块处理数据,从而节省内存并使应用程序运行得更…

    2025年12月9日
    000
  • Web 图像:完美(自动)调整大小和转换

    几乎每个前端开发人员都知道,我们需要在不影响质量的情况下向用户提供尽可能小的图像。我们都知道如何实现这一目标。但这是一件没人喜欢做的苦差事。同样从商业角度来看,这需要时间,而时间就是金钱。所以,“足够好”就够了。 让我分享一下我们如何改进和自动化完美图像交付,而不会给开发人员带来更多工作。 通常是如…

    2025年12月9日
    000
  • PHPStan:通过静态分析提高 PHP 代码质量

    在动态类型盛行的 php 生态系统中,管理代码质量并确保无错误开发可能具有挑战性。 phpstan 是一款专为 php 定制的静态分析工具,旨在帮助开发人员在运行代码之前捕获错误和潜在问题。通过静态分析,phpstan 允许开发人员通过在开发早期捕获错误来编写更可靠、可维护和健壮的代码。在这篇文章中…

    2025年12月9日
    000
  • Laravel 观察者:应用程序生命周期中的沉默忍者

    简介 想象一下,每当您在网站上提交表单时,一个隐形助手就会进来并再次检查所有内容。添加更多详细信息,甚至无需您费力即可发送一封欢迎信。 laravel 观察者就像默默工作的幕后助手。而且它的功能强大,可以在您需要时处理所有任务。在这篇文章中,我们将深入探讨观察者在 laravel 中的工作方式,以及…

    2025年12月9日
    000
  • Laravel Nightwatch:Laravel 应用程序监控的未来在 Laracon AU 上揭晓

    随着 Laracon AU 发布 Laravel Nightwatch,Laravel 的生态系统不断扩展 – 一个专门为 Laravel 应用程序设计的复杂监控平台。 Nightwatch 将于 2025 年第一季度抢先体验,承诺彻底改变开发者监控和维护 Laravel 应用程序的方式…

    2025年12月9日
    000
  • Imagick 将图片转换为 WebP 时出现分区溢出错误怎么办?

    imagick 将图片转为 webp 时出现分区溢出错误 在使用 imagick 将图片转换为 webp 格式时,您可能会遇到“partition 0 overflow (> 512k)”错误。该错误表示过程中发生了内存溢出。 解决方法: 该错误通常是由过时的 imagick 版本引起的。以下…

    2025年12月9日
    000
  • Imagick 转 WebP 出现分区溢出错误:如何解决“partition 0 overflow (> 512K)”?

    Imagick 转 WebP 出现分区溢出错误 在使用 Imagick 将图片转换为 WebP 格式时,可能会遇到分区溢出错误,提示“partition 0 overflow (> 512K)”。 错误原因 此错误表明图像中的某个分区的大小已超过允许的最大值 (512K)。分区是 WebP 文…

    2025年12月9日
    000
  • Imagick 转换图片为 WebP 时出现 “Partition 0 Overflow” 错误怎么办?

    Imagick 转换图片为 WebP 时 Partition 0 溢出 (> 512K) 的解决方法 在使用 Imagick 将图片转换为 WebP 格式时,您可能会遇到 “partition 0 overflow (> 512K)” 的错误。这表示转换过程中分配…

    2025年12月9日
    000
  • 授权:了解 Laravel 中的策略

    控制用户在应用程序中可以执行或不能执行的操作是构建实际应用程序时需要做的最重要的事情之一。 例如,在待办事项应用程序中,您不希望用户能够编辑或删除其他用户的待办事项。 在本文中,您将学习在 laravel 中实现此目的的无缝方法之一,即使用策略来控制用户可以通过构建简单的待办事项应用程序执行哪些操作…

    2025年12月9日
    000
  • PHP 函数版本更新指南:面向开发者的培训资源

    php 函数版本更新指南提供培训资源,帮助开发者应对更新,包括官方 php 手册、在线课程、社区论坛、代码库比较器和最佳实践,如定期检查发布公告、使用版本控制和在测试环境中测试更改。 PHP 函数版本更新指南:面向开发者的培训资源 PHP 函数不断更新,以提高效率、安全性并适应新的技术。对于开发者来…

    2025年12月9日
    000
  • PHP 递归函数中的堆栈溢出异常处理和恢复

    如何处理和恢复php递归函数中的堆栈溢出异常?限制递归调用的深度,避免堆栈溢出。使用set_error_handler()处理堆栈溢出异常。使用register_shutdown_function()恢复堆栈溢出,结合zend_clear_stack()函数清除堆栈。 PHP 递归函数中的堆栈溢出异…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信