亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PHP DateTime ::修改添加和減去月份

PHP DateTime ::修改添加和減去月份

PHP
catspeake 2019-09-02 14:58:28
我一直在努力工作,DateTime class并且最近遇到了我認為添加月份時的錯誤。經過一些研究后,似乎它不是一個bug,而是按預期工作。根據此處的文檔:示例#2在添加或減去月份時要小心<?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-312001-03-03任何人都可以證明為什么這不被視為錯誤?此外,是否有人有任何優雅的解決方案來糾正問題并使其成為+1個月將按預期工作而不是按預期工作?
查看完整描述

3 回答

?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

這可能很有用:


echo Date("Y-m-d", strtotime("2013-01-01 +1 Month -1 Day"));

  // 2013-01-31


echo Date("Y-m-d", strtotime("2013-02-01 +1 Month -1 Day"));

  // 2013-02-28


echo Date("Y-m-d", strtotime("2013-03-01 +1 Month -1 Day"));

  // 2013-03-31


echo Date("Y-m-d", strtotime("2013-04-01 +1 Month -1 Day"));

  // 2013-04-30


echo Date("Y-m-d", strtotime("2013-05-01 +1 Month -1 Day"));

  // 2013-05-31


echo Date("Y-m-d", strtotime("2013-06-01 +1 Month -1 Day"));

  // 2013-06-30


echo Date("Y-m-d", strtotime("2013-07-01 +1 Month -1 Day"));

  // 2013-07-31


echo Date("Y-m-d", strtotime("2013-08-01 +1 Month -1 Day"));

  // 2013-08-31


echo Date("Y-m-d", strtotime("2013-09-01 +1 Month -1 Day"));

  // 2013-09-30


echo Date("Y-m-d", strtotime("2013-10-01 +1 Month -1 Day"));

  // 2013-10-31


echo Date("Y-m-d", strtotime("2013-11-01 +1 Month -1 Day"));

  // 2013-11-30


echo Date("Y-m-d", strtotime("2013-12-01 +1 Month -1 Day"));

  // 2013-12-31


查看完整回答
反對 回復 2019-09-02
?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

這是另一個完全使用DateTime方法的緊湊解決方案,在不創建克隆的情況下就地修改對象。


$dt = new DateTime('2012-01-31');


echo $dt->format('Y-m-d'), PHP_EOL;


$day = $dt->format('j');

$dt->modify('first day of +1 month');

$dt->modify('+' . (min($day, $dt->format('t')) - 1) . ' days');


echo $dt->format('Y-m-d'), PHP_EOL;

它輸出:


2012-01-31

2012-02-29


查看完整回答
反對 回復 2019-09-02
?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

為什么它不是一個bug:

目前的行為是正確的。內部發生以下情況:


+1 month將月份數(原來為1)增加1。這就是約會2010-02-31。


第二個月(二月)在2010年只有28天,所以PHP自動更正了這一點,只是繼續計算從2月1日起的天數。然后你在3月3日結束。


如何得到你想要的:

得到你想要的是:手動檢查下個月。然后添加下個月的天數。


我希望你能親自編碼。我只是在做什么。


PHP 5.3方式:

要獲得正確的行為,您可以使用PHP 5.3的新功能之一來介紹相對時間節first day of。此節可以與指定月份的第一天結合使用next month,fifth month或者+8 months與指定月份的第一天結合使用。+1 month您可以使用此代碼來獲取下個月的第一天,而不是您正在做的事情:


<?php

$d = new DateTime( '2010-01-31' );

$d->modify( 'first day of next month' );

echo $d->format( 'F' ), "\n";

?>

此腳本將正確輸出February。當PHP處理此first day of next month節時,會發生以下情況:


next month將月份數(原來為1)增加1。這使得日期為2010-02-31。


first day of將日期編號設置為1,導致日期為2010-02-01。


查看完整回答
反對 回復 2019-09-02
  • 3 回答
  • 0 關注
  • 512 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號