7

それで、ええと、わかりました。これは数学的になるかもしれないので、関数電卓を持ってきてください ;)

これは私の問題です:

代替テキスト

最初の日付 (タイムスタンプ)、期間 (秒)、および今日の日付 (タイムスタンプ) を指定すると、期間 * n と元の/最初の日付と一致する最も近い日付を見つける必要があります。

これまでのところ、最初の日付と最後の (今日の) 日付の間の「期間」の量 (上記のデモでは「2」) など、うまく機能するものがあります。

$initial=strtotime('2 April 1991');
$time=time();
$period=strtotime('+10 years',0);

$periods=round(($time-$initial)/$period);

私が次にしたことは次のとおりです。

$range=$periods*$period;

そして最後に:

echo date('d M Y',$initial+$range);

「2011 年 4 月 3 日」と書かれています。どうやって3になったの?(うるう年の問題だと思いますか?) 小さな何かが欠けているときの気持ちを知っていますか?今全身で感じてる……。

4

4 に答える 4

2

わかりましたので、あなたが求めていることを理解できたら、特定の期間に発生する次の日付を知りたいと思います (あなたの場合、1991 年 4 月 2 日から始まる 10 年ごとに、次の日付はいつになりますか : 2011 年 4 月 2 日) )。

したがって、より正確であるため、日付に使用する方がはるかに優れている PHPのDateTimeクラスを詳しく調べる必要があります。必要なものと正確に一致するDateIntervalと混合します。

<?php
$interval = new DateInterval('P10Y'); // 10 years
$initial = new DateTime('1991-04-02');
$now = new DateTime('now');

while ($now->getTimestamp() > $initial->getTimestamp()) {
    $initial = $initial->add($interval);
}

echo $initial->format('d M Y'); // should return April 2, 2011 !
?>
于 2010-12-22T12:37:59.907 に答える
1

これを試してみてください:

$current = $initial = strtotime('2 April 1991');
$time_span = '+10 years';

while ($current < time())
{ 
  $current = strtotime($time_span, $current);
}

echo date('d M Y', $current);
于 2010-12-22T12:36:19.197 に答える
1

どうしたの:

+10 years0年 (1970 年)からは '72、'76、および '80 の 3 つのうるう年が含まれますが、'91 ~ '11 では、'92、'96、'00、'04、'08 の 5 つのうるう年しかありません。その期間を 2 回追加したので、うるう年が 6 回なかったので、1 日多くなりました。

するべきこと:

strtotimeピリオドを1 ステップずつアドします。

$period = "+10 years";
$newTime = $startingTime;
while(<condition>){
    $newTime = strtotime($period, $newTime);
}
于 2010-12-22T12:38:54.293 に答える
0

cx42netの答えの修正として:

<?php

$initial = new DateTime('2 April 1991');
$now = new DateTime('now');
$interval = new DateInterval('P10Y');

$curDate = $initial;

while (true) {
    $curDate = $curDate->add($interval);

    $curDiff = $curDate->diff($now)->days;

    if (isset($lastDiff) && ($curDiff > $lastDiff)) {
        echo $lastDate->format('d M Y');
        break;
    } else {
        $lastDate = clone $curDate;
        $lastDiff = $curDiff;
    }
}
于 2010-12-22T13:23:03.547 に答える