2013-11-04 23 views
5

Firma, nad którą pracuję, ma rok finansowy rozpoczynający się 1 stycznia, jeśli jest to czwartek, w przeciwnym razie rozpoczyna się w ostatni czwartek roku poprzedniego.PHP Oblicz początek roku obrotowego

Pisałem funkcję, która robi to, ale wydaje się nieefektywne konieczności pętli:

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')); 
    } 
} 

Próbowałem coś takiego:

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')); 
} 

Jednak to nie działa . Wiem, że robię coś nie tak podczas obliczania mojego modyfikatora, ale co?

Mam inne podobne pytania/odpowiedzi na ten temat i wszystkie są nieco inne, więc myślę, że jest to nowe, prawdziwe pytanie.

+1

Najprostszym i najlepszym rozwiązaniem byłoby [odpowiedź chumkiu za poniżej) (http://stackoverflow.com/a/19773014/67332). ** [Zobacz demo] (https://eval.in/60243) **. –

Odpowiedz

6

Według doc

„” ostatnia "nazwa dnia" pobiera ostatnią nazwę dnia z bieżącego dnia. (Przykład: "ostatni środa lipca 2008 r." Oznacza "2008-06-25", "lipiec 2008" pierwszy określa aktualną datę na "2008-07-01", a następnie "ostatni środa" przenosi się do poprzedniej środy, która jest "2008 -06-25 ").

Więc sprawa jest

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")); 
+3

Bravo, to powinna być akceptowana odpowiedź. –

+0

Dzięki - świetne, jednoliniowe rozwiązanie. Zapamiętam to na przyszłość;) –

1

Podobnie jak zabawa rzucę to w mix dla ciebie

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

Spróbuj Następnie można sprawdzić, czy to jest 1?

oczywiście trzeba będzie poprawny format do sprawdzania itp

Kocham te PHP quirks

+0

http://3v4l.org/tFvVV Nie wszystkie wersje z jakiegoś powodu =) – MackieeE

+0

Tak, skorzystałem z oświadczenia tylko dla zabawy, ale mam nadzieję, że pobudziłbym podobne rozwiązanie, BTW strona php eval nie była mi znana dzięki za to –

+0

Powraca w czwartek 10 stycznia (2013-01-10), ale to nie w porządku, w tym roku pierwszy czwartek 2013-01-03 ... –

1
<?php 

$date = date("Y")."-01-01"; 
while(date("l", strtotime($date))!="Thursday")){ 
    $date = date("Y-m-d", strtotime("-1 day", strtotime($date))); 
} 
+0

To jest bardziej zwięzła wersja mojej pierwotnej funkcji, ale czuję, że to musi być możliwe bez potrzeby pętli w ogóle ... –

+0

cóż, maksymalna iteracja dla tej pętli to tylko 6, więc nie sądzę, że jest to nieefektywne. nie mogę myśleć o niczym innym, chyba że strtotime obsługuje coś takiego jak "najbliższy czwartek do sylwestra", który wątpię w – lePunk

+0

Dla mnie wygląda to na niekończącą się pętlę, jeśli dziś nie jest czwartek ... –

0

Termin funkcja php rzeczywiście zawiera wiele prostych narzędzi, aby to zrobić! Polecam rozwiązywaniu problemu stosując następujący kod:

/** 
* Calculate the start of the financial year given a certain year 
* @param year the current year 
* @returns the date the current financial year starts 
*/ 
function getStartOffFinancialYear(String year) { 
    // Get the timestamp of this years Jan 1st 
    $timestamp = strtotime(year+'-01-01'); 

    // Check what day it is (you will get an integer) 
    $day = date('w', $timestamp) 

    if($day == 4) {   
     // If it's a thursday, we are done! 
     return $timestamp; 
    } else { 
     // Else we take the previous thursday :) 
     return strtotime("last thursday",$timestamp); 
    } 
} 
0

Jeśli chcesz korzystać z podejścia modyfikatora, spróbuj:

$modifer = ($day_num>3) ? $day_num-4 : $day_num+3; 
0

jest odpowiedź, że pracy dla mnie, znalazłem go tutaj: get the last thursday before a date in 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(); 
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"; 

?>