1

27-10-2012使用できるように に 1 週​​間を追加したいとします。

$week = 60*60*24*7;
$newdate = strtotime('27-10-2012') +$week;


または私は使用することができます

$newdate = strtotime('+1 week',strtotime('27-10-2012'));


また:

$date = new DateTime('2012-10-27');
$date->add(new DateInterval('P7D'));

特に monthes ではなくweeksを使用する場合の違いは何ですか?

参照:-
http://www.php.net/manual/en/function.strtotime.php
http://www.php.net/manual/en/function.date.php
とその関数シグネチャ。

4

5 に答える 5

1

純粋なコードの観点からは、それらはすべて同じ値を持ちます。

<?php
    $week = 60*60*24*7;
    $newdate = strtotime('27-10-2012') +$week;

    echo $newdate;
    echo '<br>';

    $newdate = strtotime('+1 week',strtotime('27-10-2012'));

    echo $newdate;
    echo '<br>';

    $date = new DateTime('2012-10-27');
    $date->add(new DateInterval('P7D'));

    echo strtotime($date->format('d-m-Y'));
?>

出力:

1351900800
1351900800
1351900800

パフォーマンスの観点から、それは少し異なります。

方法 1 を 10.000 回繰り返すと 0.025587 秒かかります

方法 2 を 10.000 回繰り返すと 0.12083 秒かかります

方法 3 を 10.000 回繰り返すと 0.05738 秒かかります

いずれの場合も、最小限なので気にする必要はありません。さて、自問してみてください: どちらがより読みやすいでしょうか?

于 2012-10-27T20:09:30.827 に答える
0

パフォーマンスには違いがあるかもしれませんが、(コードが大きなループに入っていない限り)開発者にとって最も重要な違いは読みやすさです。コードを更新する準備ができて、次のように表示される1年後の自分を想像してみてください。

$date->add(new DateInterval('P7D'));

あそこの行は次のように言っています:私の日付に間隔を追加します。間隔は「P7D」に等しくなります...それが意味するものは何でも。

またはあなたはこれを見ることができます:

$week = 60*60*24*7;
$newdate = strtotime('27-10-2012') +$week;

考えてみてください。その日付に変数$weekを追加しています。1週間は、1分あたり60秒、1時間あたり60分、1日あたり24時間、1週間あたり7日に相当します。うん、そうだね。

またはあなたは見ることができます:

$newdate = strtotime('+1 week',strtotime('27-10-2012'));

そして言う:$ newdateは27-10-2012から1週間後...次へ!

PHPはそれ自体で十分に混乱する可能性がありますが、彼がもっと混乱するのを助けないでください。

また、パフォーマンスについては、これら3つの間に市長の違いがないことを確認できますが、strtotime('+1 week'...テキストnew DateInterval('P7D')の解析を行う必要があるため、いくつかの目盛りが入る可能性があります。

于 2012-10-27T20:01:19.413 に答える
0

週を扱うのは簡単です月を試してみてください通常、私は自分自身にこの質問をします..月に何日または何週間ですか?60*60*24*Number of days間違いなく....のルートを行く月の各日が固定されていないので、あなたは自分自身にいくつかの不正確さを持っている罰金を科すかもしれません

単純なプログラミングの間違い

$newdate = time() + (60 * 60 * 24 * 28);
                                     ^-----Now you have look for num of days
var_dump(date("Y-m-d", $newdate)); //string '2012-11-24' (length=10)

$newdate = strtotime('+1 month', strtotime('27-10-2012'));
var_dump(date("Y-m-d", $newdate)); //string '2012-11-27' (length=10)

$newdate = new DateTime('2012-10-27');
$newdate->add(new DateInterval('P1M'));
var_dump($newdate->format("Y-m-d")); //string '2012-11-27' (length=10)

例1からオプションが出ています

他の注意点について....PHPDOCは言います

m / d / yまたはdmy形式の日付は、さまざまなコンポーネント間のセパレーターを調べることで明確になります。セパレーターがスラッシュ(/)の場合、アメリカのm / d/yが想定されます。一方、区切り文字がダッシュ(-)またはドット(。)の場合、ヨーロッパのdmy形式が想定されます。

あいまいさの可能性を回避するために、可能な場合はISO 8601(YYYY-MM-DD)の日付またはDateTime :: createFromFormat()を使用することをお勧めします。

いつでも渡す形式を確信してDateTime::createFromFormat()いるので、日付を処理する最も信頼できる方法であることに賭けます。100%

于 2012-10-27T20:18:09.380 に答える
0

パフォーマンス/メモリ使用量について話している場合、最初の例は最も単純でメモリを意識している可能性があります。そうは言っても、違いはわずかであり、何千もの結果をループして日付を解析しない限り、違いに気付くことはありません。

オブジェクトは優れていますが、より多くの機能と機能を備えているため、より多くのメモリを使用します。 DateTimeは使用するのに最適なオブジェクトですが、日付に週を追加するなどの単純なことをstrtotime行う場合は十分です。たとえば、1 ブロック離れた店まで歩いたり、リムジンを利用したりできます... 1 週間追加するだけの場合は、少しやり過ぎです。

そうは言ってDateTimeも、さまざまな場所のタイムゾーンと時間に関しては、より頻繁に使用するようにしています. その意味でうまく機能し、そのためにやり過ぎではありません。

すべて個人的な意見です。

于 2012-10-27T20:05:20.357 に答える
0

@pikzen (2012 年) によって得られた結果に少し驚いたので、 を使用して独自のテストを実行しstrtotime()ました。問題は正しい観点から考えられていなかったと思います。

タイムスタンプを使用する場合はstrtotime()、操作を行う前にタイムスタンプを最初から変換する必要があります。

EG私は現在、長期間にわたって停電や休日を繰り返すアルゴリズムを書いています。もちろん、多くの日付の検証と操作が必要です。

PHP 7 を使用して 1,000,000 回の繰り返しで小さなテストを実行しました。結果は次のとおりです。

日付追加テスト結果

多くの日付操作を処理する必要がある複雑なアルゴリズムの場合、文字列の DateTime ではなく整数のタイムスタンプを処理する方がわずかにメリットがあるように思えます。

テストに使用したコードは次のとおりです。

set_time_limit(180); //3 minutes

echo "<style>table, tr, th, td {border-style:solid; padding:2px;}</style>" .
    "<h1>Date add using strtotime() 1,000,000 repetitions</h1>" . 
    "<table><b><tr style='background-color:LavenderBlush;'><th>Unit</th>" .
    "<th>String date with conversion</th><th>String date w/o conversion</th>" . 
    "<th>Timestamp with conversion</th><th>timestamp w/o conversion</th></tr></b>";


//add day
echo "<tr style='background-color:aqua;'><td><b>Day</b></td>";

$date = date("Y-m-d");

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $date = date('Y-m-d', strtotime($date . '+1 day'));
}

echo "<td>" . (microtime(true) - $test) . "</td>";

$date = date("Y-m-d");

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $newDate = strtotime($date . '+1 day');
}

echo "<td>" . (microtime(true) - $test) . "</td>";


$date = strtotime(date("Y-m-d"));

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $newDate = date('Y-m-d', strtotime('+1 day', $date));
}

echo "<td>" . (microtime(true) - $test) . "</td>";


$date = strtotime(date("Y-m-d"));

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $date = strtotime('+1 day', $date);
}

echo "<td>" . (microtime(true) - $test) . "</td><tr>";


//add week
echo "<tr style='background-color:LightCyan;'><td><b>Week</b></td>";

$date = date("Y-m-d");

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $date = date('Y-m-d', strtotime($date . '+1 week'));
}

echo "<td>" . (microtime(true) - $test) . "</td>";

$date = date("Y-m-d");

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $newDate = strtotime($date . '+1 week');
}

echo "<td>" . (microtime(true) - $test) . "</td>";


$date = strtotime(date("Y-m-d"));

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $newDate = date('Y-m-d', strtotime('+1 week', $date));
}

echo "<td>" . (microtime(true) - $test) . "</td>";


$date = strtotime(date("Y-m-d"));

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $date = strtotime('+1 week', $date);
}

echo "<td>" . (microtime(true) - $test) . "</td><tr>";


//add month
echo "<tr style='background-color:LightGreen;'><td><b>Month</b></td>";

$date = date("Y-m-d");

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $date = date('Y-m-d', strtotime($date . '+1 month'));
}

echo "<td>" . (microtime(true) - $test) . "</td>";

$date = date("Y-m-d");

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $newDate = strtotime($date . '+1 month');
}

echo "<td>" . (microtime(true) - $test) . "</td>";


$date = strtotime(date("Y-m-d"));

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $newDate = date('Y-m-d', strtotime('+1 month', $date));
}

echo "<td>" . (microtime(true) - $test) . "</td>";


$date = strtotime(date("Y-m-d"));

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $date = strtotime('+1 month', $date);
}

echo "<td>" . (microtime(true) - $test) . "</td><tr>";



//add year
echo "<tr style='background-color:LightGoldenRodYellow;'><td><b>Year</b></td>";

$date = date("Y-m-d");

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $date = date('Y-m-d', strtotime($date . '+1 year'));
}

echo "<td>" . (microtime(true) - $test) . "</td>";

$date = date("Y-m-d");

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $newDate = strtotime($date . '+1 year');
}

echo "<td>" . (microtime(true) - $test) . "</td>";


$date = strtotime(date("Y-m-d"));

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $newDate = date('Y-m-d', strtotime('+1 year', $date));
}

echo "<td>" . (microtime(true) - $test) . "</td>";


$date = strtotime(date("Y-m-d"));

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $date = strtotime('+1 year', $date);
}

echo "<td>" . (microtime(true) - $test) . "</td><tr></table>";


//string date comparation 

echo "<br /><h1>Date comparission with 1,000,000 repetition</h1>";


$date = date("Y-m-d");

$i = 0;

$newDate = date('Y-m-d', strtotime($date . '+1 year'));

$test = microtime(true);

while ($i < 1000000) {

    if ($date !== $newDate) {

        $i++;
    }
}

echo "<br / ><b>String date comparission:</b> " . (microtime(true) - $test) . "<br />";


//timestamp comparision

$date = strtotime($date);

$i = 0;

$newDate = strtotime($newDate);

$test = microtime(true);

while ($i < 1000000) {

    if ($date !== $newDate) {

        $i++;
    }
}

echo "<b>timestamp comparission:</b> " . (microtime(true) - $test) . "<br />";
于 2017-09-28T19:16:47.983 に答える