草庐IT

PHP DateTime::modify 加减月份

coder 2023-04-24 原文

我一直在使用 DateTime class最近在添加月份时遇到了我认为是错误的问题。经过一番研究,它似乎不是一个错误,而是按预期工作。根据找到的文档 here :

Example #2 Beware when adding or subtracting months

<?php
$date = new DateTime('2000-12-31');

$date->modify('+1 month');
echo $date->format('Y-m-d') . "\n";

$date->modify('+1 month');
echo $date->format('Y-m-d') . "\n";
?>
The above example will output:
2001-01-31
2001-03-03

谁能证明为什么这不是一个错误?

此外,是否有人有任何优雅的解决方案来纠正问题并使其 +1 个月按预期工作而不是按预期工作?

最佳答案

为什么它不是错误:

当前行为是正确的。以下发生在内部:

  1. +1 月 将月份数(原为 1)加一。这使得日期 2010-02-31.

  2. 2010 年的第二个月(2 月)只有 28 天,因此 PHP 会自动更正此问题,只需继续从 2 月 1 日开始计算天数。然后你在 3 月 3 日结束。

如何得到你想要的:

要得到你想要的东西是:手动检查下个月。然后加上下个月的天数。

我希望您可以自己编写代码。我只是给出要做什么。

PHP 5.3 方式:

要获得正确的行为,您可以使用 PHP 5.3 的一个新功能,该功能引入了相对时间节 first day of。本节可与下个月第五个月+8个月结合使用,以转到指定月份的第一天。您可以使用此代码来获取下个月的第一天,而不是您正在执行的操作中的 +1 个月:

<?php
$d = new DateTime( '2010-01-31' );
$d->modify( 'first day of next month' );
echo $d->format( 'F' ), "\n";
?>

此脚本将正确输出 February。当 PHP 处理这个 下个月的第一天 节时会发生以下事情:

  1. 下个月 将月份编号(最初为 1)加一。这使得日期为 2010-02-31。

  2. first day of 将日期编号设置为 1,从而得到日期 2010-02-01。

关于PHP DateTime::modify 加减月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3602405/

有关PHP DateTime::modify 加减月份的更多相关文章

  1. ruby-on-rails - Rails 3 Formtastic。如何让 formtastic 仅显示月份和年份字段而不显示日期? - 2

    我需要formtastic来仅显示月份和年份字段,而不显示日期字段。日期选择器很好,但它显示了整个日历。我不想要日期选择器。f.input:accounting_month,:label=>"会计月份",:as=>:datepicker我只需要月份和年份。 最佳答案 有一种方法可以做到这一点:"Accountingmonth",:order=>[:month,:year]这将自动隐藏“天”输入并为其指定默认值1。 关于ruby-on-rails-Rails3Formtastic。如何让f

  2. ruby-on-rails - 如何显示信用卡的月份和年份选择 - 2

    我正在使用Rails3.1。这是我的代码,要求用户输入信用卡到期月份和年份。以上代码有效。但是,问题是如果出现验证错误,则会重置所选的到期时间和月份。我试过f.select_month但不支持。 最佳答案 尝试这样的事情:true,:start_year=>Date.today.year,:end_year=>(Date.today.year+10),:use_month_numbers=>true%> 关于ruby-on-rails-如何显示信用卡的月份和年份选择,我们在StackOv

  3. ruby-on-rails - rails : modify form parameters before modifying the database - 2

    我正在开发一个通过表单发送数据的Rails应用程序。我想在表单发送之后,但在它被处理之前修改表单的一些“参数”。我现在拥有的{"commit"=>"Create","authenticity_token"=>"0000000000000000000000000""page"=>{"body"=>"TEST","link_attributes"=>[{"action"=>"Foo"},{"action"=>"Bar"},{"action"=>"Test"},{"action"=>"Blah"}]}}我想要什么{"commit"=>"Create","authenticity_token"

  4. ruby-on-rails - Ruby 方法获取给定日期所属季度的月份 - 2

    我有一个日期,我想找出那个特定季度的月份。我怎样才能以最简单的方式在ruby​​中完成这项工作?我的意思是,如果我给出的日期是27-04-2011,那么我必须得到的结果是四月、五月、六月,作为字符串或整数,如四月到六月的4、5、6。 最佳答案 您可以通过执行以下操作获取任何日期的季度:quarter=(((Date.today.month-1)/3)+1).to_i或者更短:quarter=(Date.today.month/3.0).ceil 关于ruby-on-rails-Ruby方

  5. ruby 正则表达式 : ^ matches start of line even without m modifier? - 2

    ruby1.8.7。我正在使用带有^的正则表达式来匹配字符串开头的模式。问题是,如果在字符串中任何行的开头找到模式,它仍然匹配。如果我使用“m”修饰符但我没有使用,这是我期望的行为:$irbirb(main):001:0>str="hello\ngoodbye"=>"hello\ngoodbye"irb(main):002:0>putsstrhellogoodbye=>nilirb(main):004:0>str=~/^goodbye/=>6我在这里做错了什么? 最佳答案 行首:^行尾:$字符串的开头:\A字符串结尾:\z

  6. ruby-on-rails - 是否可以在 Rails 中的两个日期之间创建月份列表 - 2

    我正在尝试创建一个页面来显示每个月的链接列表,按年分组。月份需要介于今天和第一个条目的日期这两个日期之间。我在一堵砖墙前,我不知道如何创建它。我们将不胜感激任何帮助问候亚当 最佳答案 只需将您想要的内容放入范围循环中,然后像这样使用Date::MONTHNAMES数组(date.year..laterdate.year).eachdo|y|mo_start=(date.year==y)?date.month:1mo_end=(laterdate.year==y)?laterdate.month:12(mo_start..mo_end

  7. ruby-on-rails - 为什么我会收到此 'can' t modify frozen hash' 错误? - 2

    我有一个Person模型和一个Item模型。一个人有很多元素,一个元素属于一个人。在此代码中,我需要删除一个人的现有项目,并根据参数(这是一个哈希数组)创建新项目。然后,我需要根据项目的其他字段之一更新项目的字段之一。@person=Person.find(params["id"])@person.person_items.eachdo|q|q.destroyendperson_items_from_param=ActiveSupport::JSON.decode(params["person_items"])person_items_from_param.eachdo|pi|@per

  8. ruby - 在 ruby​​ 中创建两个日期之间的月份范围 - 2

    我需要在几个月的范围内每月创建日志文件。因此我需要给定范围内的所有[year,month]元组如何迭代日期?如果我每天都需要迭代,怎么办? 最佳答案 例如:((Date.today-90)..Date.today).map{|d|[d.year,d.month]}.uniq#=>[[2012,12],[2013,1],[2013,2],[2013,3]] 关于ruby-在ruby​​中创建两个日期之间的月份范围,我们在StackOverflow上找到一个类似的问题:

  9. ruby-on-rails - rails : RuntimeError - can't modify frozen Array when running rspec in rails - 2

    我最近从v4.3升级到Rails5.1,现在在运行测试时遇到这个错误:Anerroroccurredwhileloading./spec/controllers/admin/capacity_charges_controller_spec.rb.Failure/Error:requireFile.expand_path('../../config/environment',__FILE__)RuntimeError:can'tmodifyfrozenArray我为每个测试文件都得到了它。触发错误的行来自rails_helper。我已经检查了Rails5.1示例repo协议(protoc

  10. ruby-on-rails - 如何从月份编号获取月份名称 - 2

    这个问题在这里已经有了答案:Nameofthismonth(Date.today.monthasname)(6个答案)关闭7年前。我可以获得下个月的月数和年份:(Time.now+1.month).month#=>10(Time.now+1.month).year#=>2015如何从10获取"October"?

随机推荐