我一直在使用 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)加一。这使得日期 2010-02-31.
2010 年的第二个月(2 月)只有 28 天,因此 PHP 会自动更正此问题,只需继续从 2 月 1 日开始计算天数。然后你在 3 月 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)加一。这使得日期为 2010-02-31。
first day of 将日期编号设置为 1,从而得到日期 2010-02-01。
关于PHP DateTime::modify 加减月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3602405/
我需要formtastic来仅显示月份和年份字段,而不显示日期字段。日期选择器很好,但它显示了整个日历。我不想要日期选择器。f.input:accounting_month,:label=>"会计月份",:as=>:datepicker我只需要月份和年份。 最佳答案 有一种方法可以做到这一点:"Accountingmonth",:order=>[:month,:year]这将自动隐藏“天”输入并为其指定默认值1。 关于ruby-on-rails-Rails3Formtastic。如何让f
我正在使用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
我正在开发一个通过表单发送数据的Rails应用程序。我想在表单发送之后,但在它被处理之前修改表单的一些“参数”。我现在拥有的{"commit"=>"Create","authenticity_token"=>"0000000000000000000000000""page"=>{"body"=>"TEST","link_attributes"=>[{"action"=>"Foo"},{"action"=>"Bar"},{"action"=>"Test"},{"action"=>"Blah"}]}}我想要什么{"commit"=>"Create","authenticity_token"
我有一个日期,我想找出那个特定季度的月份。我怎样才能以最简单的方式在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方
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
我正在尝试创建一个页面来显示每个月的链接列表,按年分组。月份需要介于今天和第一个条目的日期这两个日期之间。我在一堵砖墙前,我不知道如何创建它。我们将不胜感激任何帮助问候亚当 最佳答案 只需将您想要的内容放入范围循环中,然后像这样使用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
我有一个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
我需要在几个月的范围内每月创建日志文件。因此我需要给定范围内的所有[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上找到一个类似的问题:
我最近从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
这个问题在这里已经有了答案:Nameofthismonth(Date.today.monthasname)(6个答案)关闭7年前。我可以获得下个月的月数和年份:(Time.now+1.month).month#=>10(Time.now+1.month).year#=>2015如何从10获取"October"?