5

現在の日付までの会計年度を前年の同じ日付範囲と比較するシステムがあります。表示する年と月を調整でき、常に同じ日付範囲を前年と比較します。現在の日がうるう日である場合は昨年の28日と比較し、昨年がうるう年で今日が2月28日である場合は、昨年の29日までと比較するように設定しました。現在の月以外の月を見ると、その月の最終日まで表示されます。それ以外の場合は、現在の日付まで表示されます。

今は問題なく動作しますが、今では私の雇用主は、昨日の日付まで上げたい現在の日付まで上げたくありません。どうすればよいですか。私の主な関心事は、今日が月の1日である場合、または今日が会計年度の初日である場合はどうなるかです。

これが私が今持っているコードです:

function create_YTD_XML()
{
    global $month;
    global $year;

    $last_year = $year - 1;

    if($year == date('Y') && $month == date('m'))
    {
        $this_day = date('d');
    }
    else
    {
        $this_day = date('t', mktime(0, 0, 0, $month, 1, $year)); // LAST DAY OF MONTH
    }

    if(is_leap_year($year) && $this_day == 29)
    {
        $last_day = 28;
    }
    else if(is_leap_year($last_year) && $this_day == 28)
    {
        $last_day = 29;
    }
    else
    {
        $last_day = $this_day;
    }

    if($month >= 2)
    {
        $this_year_start = $year;
        $last_year_start = $last_year;
    }
    else
    {
        $this_year_start = $year - 1;
        $last_year_start = $last_year - 1;
    }

    $this_ytd_start = $this_year_start.'-02-01';
    $last_ytd_start = $last_year_start.'-02-01';

    $this_ytd_end = $year.'-'.str_pad($month, 2, "0", STR_PAD_LEFT).'-'.$this_day;
    $last_ytd_end = $last_year.'-'.str_pad($month, 2, "0", STR_PAD_LEFT).'-'.$last_day;


}

最善の解決策は何でしょうか?

ありがとう!

4

9 に答える 9

26

strtotime()がそのトリックを行います。mktime()を使用して前の日付をUnixタイムスタンプに変換し、次のように使用します。

$from_unix_time = mktime(0, 0, 0, $month, $day, $year);
$day_before = strtotime("yesterday", $from_unix_time);
$formatted = date('Y-m-d', $day_before);
于 2009-04-23T14:18:40.533 に答える
24

次のような単語を使用してstrtotime関数を使用することもできます。

$date = '2012-11-08';
$day_before = date( 'Y-m-d', strtotime( $date . ' -1 day' ) );

の出力$day_before:

2012-11-07
于 2012-11-08T13:43:15.407 に答える
6

「誤った」値を処理するmktime()の機能に依存することができます。$ year、$ month、および$dayが現在の日であると仮定します。

$yesterday = mktime (0, 0, 0, $month, $day - 1, $year);
echo date ('Y-m-d', $yesterday);

心配しないでください、それはちょうど正しいことをします:異なる値で自分自身を試してください。

于 2009-04-23T14:28:47.903 に答える
2

注:次の回答では、夏時間を考慮していません。1 年の特定の時期に、不正確な結果が返されます。詳細については、コメントを参照してください。


1 日の長さは一定 (86,400 秒) であるため、算術演算を使用して、特定の日付の前日のタイムスタンプを決定できます。

$yesterday = date('Y-m-d', strtotime($current_date) - 86400);

$current_date前日を検索する日付です。すでにunix タイムスタンプstrtotime()である場合は、完全に省略できます。

$yesterday = date('Y-m-d', $current_date_as_unix_timestamp - 86400);
于 2011-12-23T18:42:34.587 に答える
2
$date = date('Y-m-d',strtotime('yesterday'));
于 2011-04-08T13:56:35.257 に答える
0

それはあなたの雇用主が望んでいる行動に依存すると思います。「正しい」答えはありません。今日が会計年度の始まりである場合、過去2会計年度を比較したいですか(昨日を「最新」の日付として使用した場合に発生します)、それとも彼らは望んでいますか昨年の1日目と比較して今年度の1日目を確認するには?あなたは座って潜在的なエッジケースを理解し、次に彼らが何を望んでいるかについてあなたの雇用主と話し合う必要があります。

于 2009-04-23T14:26:49.297 に答える
0

前日の定刻 07:59:59

$demo = date("Y-m-d H:i:s", mktime(7, 59, 59, date("m"),date("d")-1,date("Y")));    
于 2014-11-25T05:27:26.813 に答える
0

次のコードを使用することもできます。

$current_date = strtotime('25-11-2012');
echo $yesterday = date('Y-m-d', strtotime('-1 day', $current_date));

コードの出力は次のとおりです。

2012-11-24
于 2012-11-13T13:53:16.397 に答える