Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
1ヶ月後の日付を返す(1ヶ月飛ばさない)
<?php
/**
* getCorrectedNextMonth
*
* 年月日を渡すとその翌月の当日を調整して返す
*
* 2011-01-31を渡すと、2011-02-31や2011-03-03ではなく
* 翌月内に収まるようにして2011-02-28を返す
* 月額課金をわかり易くするために使う。
*
* @access public
* @param string $date
* @return string $date
*/
public function getCurrectedNextMonth($date)
{
// 年月日に分断
$y = date('Y', strtotime($date));
$m = date('n', strtotime($date));
$d = date('j', strtotime($date));
// 年越しの処理
if($m+1>12) { $m=1; $y++; } else { $m++; }
// 1ヶ月後の日付生成
if(checkdate($m, $d, $y)) {
return date('Y-m-d', strtotime(sprintf('%04d-%02d-%02d', $y, $m, $d)));
} else {
return date('Y-m-d', strtotime(sprintf('%04d-%02d-01 -1 day', $y, ($m+1))));
}
}
@ogaaaan

This comment has been minimized.

Copy link
Owner Author

@ogaaaan ogaaaan commented Aug 1, 2011

例えば1月31日からstrtotime()関数などで1ヶ月先を指定すると、2月の28日間(閏年なら29日間)をすっとばし、3月3日になってしまう。

これでは日本でよくある「月額課金」に対応できないため、初回支払い日が翌月に存在しない場合、翌月の最終日を自動的に設定し、翌月を必ず口語で言う所の「1ヶ月後」とする関数。

大したことやってないけど、一応覚え書きとして。

最終日の出し方は、出したい付きの翌月1日から1日前、という相対指定で実現。29行目。

@ogaaaan

This comment has been minimized.

Copy link
Owner Author

@ogaaaan ogaaaan commented Aug 1, 2011

年越しの処理忘れていたので追記

@ogaaaan

This comment has been minimized.

Copy link
Owner Author

@ogaaaan ogaaaan commented Aug 2, 2011

関数名と、pearコメントを修正

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment