5

私が働いている会社の会計年度は、木曜日の場合は 1 月 1 日から始まり、それ以外の場合は前年の最後の木曜日から始まります。

これを行う関数を作成しましたが、ループする必要があるのは非効率的です。

function get_start_of_financial_year() {
    $date = date('Y').'-01-01';
    $correct_day = false;
    while(!$correct_day) {
        $day_num = date('N', strtotime($date));
        if($day_num==4) return $date;
        $date = date('Y-m-d', strtotime($date.' -1 day'));
    }
}

私はこのようなことを試みてきました:

function get_start_of_financial_year() {
    $date = date('Y').'-01-01';
    $day_num = date('N', strtotime($date));
    $modifer = 4 - $day_num;
    return date('Y-m-d', strtotime($date.' -'.$modifer.' days'));
}

ただし、これは機能しません。モディファイアを計算するときに何か間違ったことをしていることはわかっていますが、何ですか?

ここで他の同様の質問/回答を見てきましたが、すべてわずかに異なるため、これは真の新しい質問だと思います.

4

7 に答える 7

6

ドキュメントによると

「'last' dayname」は、現在の日付から最後の dayname を取ります。(例: "last wed July 2008" は "2008-06-25" を意味します。"july 2008" は最初に現在の日付を "2008-07-01" に設定し、次に "last wed" を前の水曜日である "2008" に移動します。 -06-25")。

だからあなたのケースは

function get_start_of_financial_year($year) {
    // get the first Thursday before 2 Jan of $year
    return date("Y-m-d", strtotime("last Thursday $year-01-02"));
}

echo get_start_of_financial_year( date("Y") );
于 2013-11-04T17:04:08.143 に答える
1

楽しいのと同じように、私はあなたのためにこれをミックスに入れます

echo date('l jS F (Y-m-d)', strtotime('first thursday january this year'));

試してみてください。それから、それが 1st であるかどうかを確認できますか?

明らかに、チェックなどのために正しいフォーマットが必要になります

私はこれらのPHPの癖が大好きです

于 2013-11-04T16:43:53.100 に答える
1
<?php

$date = date("Y")."-01-01";
while(date("l", strtotime($date))!="Thursday")){
    $date = date("Y-m-d", strtotime("-1 day", strtotime($date)));
}
于 2013-11-04T16:48:34.553 に答える
0
<?php
$cur_dt = date('Ymd', mktime(0, 0, 0, date("m")  , date("d"), date("Y")));
//$cur_dt = date('Ymd', mktime(0, 0, 0, 5  , 10, 2013));
//$cur_dt = date('Ymd', mktime(0, 0, 0, 2  , 10, 2013));
$cur_mm="";
$cur_yy="";
$fin_st_dd="";
$fin_st_mm="";
$fin_st_yy="";
$fin_nd_dd="";
$fin_nd_mm="";
$fin_nd_yy="";
$cur_mm= substr(trim($cur_dt),4,2);
$cur_yy= substr(trim($cur_dt),0,4);


if ( $cur_mm >= "04" && $cur_mm <= "12" )
{
    $fin_st_dd="01";
    $fin_st_mm="04";
    $fin_st_yy=$cur_yy;
    $fin_nd_dd="31";
    $fin_nd_mm="03";
    $fin_nd_yy=$cur_yy+1;
}

if ($cur_mm >= "01" && $cur_mm <= "03")
{
    $fin_st_dd="01";
    $fin_st_mm="04";
    $fin_st_yy=$cur_yy-1;
    $fin_nd_dd="31";
    $fin_nd_mm="03";
    $fin_nd_yy=$cur_yy;
}

$fin_st = date('Ymd', mktime(0, 0, 0, $fin_st_mm , $fin_st_dd, $fin_st_yy));
$fin_nd = date('Ymd', mktime(0, 0, 0, $fin_nd_mm , $fin_nd_dd, $fin_nd_yy));


echo "\nCurrent Date: $cur_dt\n";
echo "\nFinancial Year From : $fin_st To : $fin_nd\n";
//echo "\n$fin_nd\n";
//echo "\n$fin_st_mm";
//echo "\n$fin_st_yy\n";
//echo "\n$fin_st_mm";
//echo "\n$fin_nd_mm";
//echo "\n$fin_nd_yy\n";

?>
于 2014-05-23T10:53:09.987 に答える
0

私のために働く答えがあります、私はここでそれを見つけました: PHPで日付の前の最後の木曜日を取得します

function get_start_of_financial_year() {
$date = strtotime('2014-01-01');
if(date('N',$date) != 4)
    return date('Y-m-d', strtotime("last thursday",$date));
else
    return $date;
}

echo get_start_of_financial_year();
于 2013-11-04T17:25:28.493 に答える
0

修飾子アプローチを使用する場合は、次を試してください。

  $modifer = ($day_num>3) ? $day_num-4 :  $day_num+3;
于 2013-11-04T16:57:27.377 に答える