草庐IT

php - strtotime() 被认为是有害的?

coder 2023-12-30 原文

似乎很多人都在为 PHP 中的日期/时间问题而苦恼,而且不可避免地,许多被接受的答案往往是“Use strtotime in this way”。

这真的是指导人们处理约会问题的最佳方式吗?我开始觉得 strtotime 是一种巧妙的技巧,在重要的日期/时间计算中不一定要依赖它,而且根据它采用任意字符串的性质,它看起来像是一个错误的、难以预测的行为的潜在来源。它无法区分 MM/DD/YYYY 和 DD/MM/YYYY 有点大问题,不是吗?

StackOverflow 通常非常擅长推广良好实践(我很少看到没有人说“使用 PDO 代替”的 mysql_real_escape_string 对话。)

但是在 PHP 中似乎没有关于日期问题的公认规范,许多人求助于 strtotime

那么,如果有的话,我们应该怎么做呢?对于提出“如何将 1 周加到 X”或“如何将此日期格式转换为其他日期格式?”等问题的人,我们是否应该执行更好的规范?

处理像 strtotime 这样的日期/时间问题的最好、最可靠的方法是什么,但往往失败了?

最佳答案

首先我会说我是使用 DateTime 对象的大力倡导者,它允许您使用 DateTime::createFromFormat() 功能。 DateTime 对象使代码更具可读性,并且避免了使用 60 * 60 * 24 进行整个 Unix 时间戳修改来提前日期天数的需要。

也就是说,strtotime() 采用的任意字符串并不难预测。 Supported Date and Time Formats列出支持的格式。

根据您无法区分 MM/DD/YYYY 和 DD/MM/YYYY 的示例,它确实根据 Date Formats 进行了区分。 .使用斜杠的日期始终以美国格式读取。因此格式为 00/00/0000 的日期将始终被读取为 MM/DD/YYYY。或者使用破折号或句点将是 DMY。例如00-00-0000 将始终被读取为 DD-MM-YYYY。

这里有一些例子:

<?php
$dates = array(
    // MM DD YYYY
    '11/12/2013' => strtotime('2013-11-12'),
    // Using 0 goes to the previous month
    '0/12/2013' => strtotime('2012-12-12'), 
    // 31st of November (30 days) goes to 1st December
    '11/31/2013' => strtotime('2013-12-01'), 
    // There isn't a 25th month... expect false
    '25/12/2013' => false,

    // DD MM YYYY
    '11-12-2013' => strtotime('2013-12-11'),
    '11.12.2013' => strtotime('2013-12-11'),
    '31.12.2013' => strtotime('2013-12-31'),
    // There isn't a 25th month expect false
    '12.25.2013' => false,
);

foreach($dates as $date => $expected) {
    assert(strtotime($date) == $expected);
}

如您所见,两个关键示例是 25/12/201312.25.2013如果以相反的格式读取它们都是有效的,但是它们返回 false 因为根据支持的日期和时间格式它们是无效的...

如您所见,行为是完全可以预测的。与往常一样,如果您从使用输入中收到日期,您应该首先验证该输入。如果您不首先验证输入,则任何方法都不起作用。

如果您想非常具体地说明正在阅读的日期,或者您提供的格式不受支持,那么我建议使用 DateTime::createFromFormat() .

关于php - strtotime() 被认为是有害的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5287224/

有关php - strtotime() 被认为是有害的?的更多相关文章

  1. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  2. ruby - 在好的 Ruby 代码中没有注释是否被认为是可以接受的? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭5年前。Improvethisquestion我审查了一些用Ruby编写的专业代码,没有发现任何评论。代码读起来相当清晰,但没有self记录。我应该期望专业编写的Ruby代码有注释吗?或者,是否有一些Ruby原则认为注释不是必需的?

  3. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  4. ruby 认为我在引用一个顶级常量,即使我指定了完整的命名空间 - 2

    在我的应用程序中我有classUserincludeUser::FooendUser::Foo定义在app/models/user/foo.rb现在我正在使用一个定义了自己的Foo类的库。我收到此错误:warning:toplevelconstantFooreferencedbyUser::FooUser仅引用具有完整路径的Foo,User::Foo,而Foo实际上从来没有指的是Foo。这是怎么回事?更新:才想起我之前遇到过同样的问题,在问题1中看到这里:HowdoIrefertoasubmodule's"fullpath"inruby? 最佳答案

  5. ruby - 为什么我会看到这两个几乎相同的 Ruby 正则表达式模式的不同结果,为什么一个匹配我认为不应该匹配的内容? - 2

    使用Ruby1.9.2,我在IRB中有以下Ruby代码:>r1=/^(?=.*[\d])(?=.*[\W]).{8,20}$/i>r2=/^(?=.*\d)(?=.*\W).{8,20}$/i>a=["password","1password","password1","pass1word","password1"]>a.each{|p|puts"r1:#{r1.match(p)?"+":"-"}\"#{p}\"".ljust(25)+"r2:#{r2.match(p)?"+":"-"}\"#{p}\""}这会产生以下输出:r1:-"password"r2:-"password"r1:

  6. ruby-on-rails - Rails 还是 Sinatra? PHP程序员入门学习哪个好? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?

  7. ruby-on-rails - 为什么 Rails Gemfile 默认为 https 而 http 使 bundler 更快? - 2

    gem文件中Rails的默认gems源是:source'https://rubygems.org'将其更改为source'http://rubygems.org'使bundle安装速度更快,因此我试图了解将https设为默认设置的决定背后的原因。有什么我需要注意的吗? 最佳答案 表格here:SwitchingtoHTTPisdangerous.ItopensyoutoMITMattacks.SwitchingtoHTTPallowshostilepartiestoreplacegemcontentswithmaliciouscon

  8. ruby-on-rails - PHP 魔术方法 __call、__get 和 __set 的 Ruby 等价物 - 2

    我很确定Ruby有这些(等同于__call、__get和__set),否则find_by将如何在Rails中工作?也许有人可以举一个简单的例子来说明如何定义与find_by相同的方法?谢谢 最佳答案 简而言之你可以映射__调用带有参数的method_missing调用__设置为方法名称以'='结尾的method_missing调用__获取不带任何参数的method_missing调用__调用PHPclassMethodTest{publicfunction__call($name,$arguments){echo"Callingob

  9. ruby - Lisp - 是否适合网络编程/应用程序(交互式)? ruby 的方式是? php的方式是? - 2

    Lisp是否适合Web编程/应用程序(交互式),就像ruby​​和php一样?需要考虑的事情是:易于使用可部署性难度(尤其是对于编程初学者而言)(编辑)在阅读PaulGraham'sessay之后,我特别提到了CommonLisp.将是我的第一门编程语言。在这方面。这样做合适吗?我听说Clojure的宏功能不如CommonLisp的强大,这就是我尝试学习Clojure的原因。它教授编程并且非常强大。 最佳答案 Lisp是一个语系,而不是单一的语言。为了稍微回答您的问题,是的,存在用于各种Lisp方言的Web框架,例如用于Common

  10. 软件工程毕业设计课题(81)微信小程序毕业设计PHP校园跑腿小程序系统设计与实现 - 2

        项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信校园跑腿小程序系统,前台用户使用小程序发布跑腿任何和接跑腿任务,后台管理使用基于PHP+MySql的B/S架构;通过后台管理跑腿的用户、查看跑腿信息和对应订单。意义:手机网络时代,大学生通过手机网购日常用品、外卖外卖、代取快递等已不再是稀奇的事情。此外,不少高校还流行着校园有偿工作,校园跑腿就成了大学生创业服务项目。        因为你在校园里,所以不会有进入的限制。并不是所有的外卖平台都可以随意进入校园,比如小黄和小蓝的双打外卖平台。许多大学禁止送餐进入学校,更不用说送餐进入宿舍了。这一措施使得校园服务市场的竞争相对不

随机推荐