2009-08-05 1 views
17

PHP bietet Möglichkeiten, die Nummer des aktuellen Tages des Monats (Datum ('j')) sowie die Nummer des aktuellen Tages des Jahres (Datum ('Z')) zu erhalten. Gibt es eine Möglichkeit, die Nummer des aktuellen Tages des aktuellen Quartals zu erhalten?Einfacher Weg zur Tagesnummer des aktuellen Quartals?

Also gerade jetzt, 5. August, ist es Tag 36 des dritten Quartals.

Wenn es keine Standardmethode gibt, um dies zu berechnen, hat jemand einen (wahrscheinlich PHP-basierten) Algorithmus zur Hand?

+0

Wie definieren Sie "Viertel"? –

+0

Eine Gruppe von drei Monaten. –

+1

Pseudocode: Tag_des_Quarters (y, m, d) = Tag_des_Jahres (y, m, d) - Tag_des_Jahrs (y, 3 * ((m-1)% 3) + 1, 1) + 1 – balpha

Antwort

11

Ich schrieb eine Klasse mit den folgenden Methoden. Genießen.

public static function getQuarterByMonth($monthNumber) { 
    return floor(($monthNumber - 1)/3) + 1; 
} 

public static function getQuarterDay($monthNumber, $dayNumber, $yearNumber) { 
    $quarterDayNumber = 0; 
    $dayCountByMonth = array(); 

    $startMonthNumber = ((self::getQuarterByMonth($monthNumber) - 1) * 3) + 1; 

    // Calculate the number of days in each month. 
    for ($i=1; $i<=12; $i++) { 
    $dayCountByMonth[$i] = date("t", strtotime($yearNumber . "-" . $i . "-01")); 
    } 

    for ($i=$startMonthNumber; $i<=$monthNumber-1; $i++) { 
    $quarterDayNumber += $dayCountByMonth[$i]; 
    } 

    $quarterDayNumber += $dayNumber; 

    return $quarterDayNumber; 
} 

public static function getCurrentQuarterDay() { 
    return self::getQuarterDay(date('n'), date('j'), date('Y')); 
} 
1

Angenommen, Sie meinen ein Kalenderquartal (weil ein Geschäftsjahr eines Unternehmens in einem beliebigen Monat des Jahres beginnen kann), können Sie sich auf das Datum ('z') verlassen, um den Tag zu bestimmen jedes Quartal eine einfache Anordnung des Tages beginnt am:

$quarterStartDays = array(1 /* Jan 1 */, 90 /* Mar 1, non leap-year */, ...); 

dann mit dem aktuellen Tag-of-Jahr können Sie zuerst den größten Start-Tag suchen, die weniger ist als oder gleich das Tag-of-Jahr, dann subtrahieren.

Beachten Sie, dass Sie je nach Schaltjahr unterschiedliche Nummern benötigen.

1
<?php 
function day_of_quarter($ts=null) { 
    if(is_null($ts)) $ts=time(); 
    $d=date('d', $ts); 
    $m=date('m', $ts)-1; 
    while($m%3!=0) { 
     $lastmonth=mktime(0, 0, 0, $m, date("d", $ts), date("Y",$ts)); 
     $d += date('t', $lastmonth); 
     $m--; 
    } 
    return $d; 
} 
echo day_of_quarter(mktime(0, 0, 0, 1, 1,2009)); 
echo "\n"; 
echo day_of_quarter(time()); 
echo "\n"; 
?> 
49

Wie wäre:

$curMonth = date("m", time()); 
$curQuarter = ceil($curMonth/3); 

Et voila :-)

+9

Ich kann wirklich nicht herausfinden, warum diese Antwort so viele upvotes erhalten hat, wie es die Frage überhaupt nicht beantwortet - es ist nur das Finden des Viertels, das nicht die Frage war – DHS

+15

Es wird upvotes, weil Leute herkommen, während sie suchen eine mathematische Formel, um das Viertel herauszufinden – LucasSeveryn

+1

Diese Antwort sollte ein Kommentar sein. – mickmackusa

6
function date_quarter() 
{ 
    return ceil(date('n', time())/3); 
} 

oder

function date_quarter() 
{ 
    $month = date('n'); 

    if ($month <= 3) return 1; 
    if ($month <= 6) return 2; 
    if ($month <= 9) return 3; 

    return 4; 
} 
0

Sie könnenverwendenes einfach Modifikatoren für getFirstOf {Monat, Jahr, Quartal}()

<?php 
//take current date 
$now = Carbon\Carbon::now(); 

//modify a copy of it to the first day of the current quarter 
$firstOfQuarter = $now->copy()->firstOfQuarter(); 

//calculate the difference in days and add 1 to correct the index 
$dayOfQuarter = $now->diffInDays($firstOfQuarter) + 1; 
0
<?php 

function trimester_day($time = null) { 
    $time = $time ? intval($time) : time(); 
    $date = intval(date("j", $time)); 
    $month = intval(date("n", $time)); 
    $year = intval(date("Y", $time)); 
    // get the selected quarter as number between 1 and 4 
    $quarter = ceil($month/3); 
    // get the first month of current quarter in n format 
    $fmonth = $quarter + (($quarter - 1) * 2); 
    // map days in a year by month 
    $map = [31,28,31,30,31,30,31,31,30,31,30,31]; 
    // check if is leap year 
    if (((($year % 4) == 0) && ((($year % 100) != 0) || (($year % 400) == 0)))) { 
     $map[1] = 29; 
    } 
    // get total number of days in selected quarter, by summing the relative portion of $map array 
    $total = array_sum(array_slice($map, ($fmonth - 1), 3)); 
    // get number of days passed in selected quarter, by summming the relative portion of $map array 
    $map[$month-1] = $date; 
    $day = array_sum(array_slice($map, ($fmonth - 1), ($month - $fmonth + 1))); 
    // return 
    return "Day number " . $day . " on " . $total . " of quarter " . $quarter . ", $year."; 
} 

$time = strtotime("2017-01-01"); // return Day number 1 on 90 of quarter 1, 2017. 
$time = strtotime("2017-04-01"); // return Day number 1 on 91 of quarter 2, 2017. 
$time = strtotime("2017-08-15"); // return Day number 46 on 92 of quarter 3, 2017. 
$time = strtotime("2017-12-31"); // return Day number 92 on 92 of quarter 4, 2017. 

echo trimester_day($time) . "\n"; 
+0

Sie sollten eine Beispieleingabe und -ausgabe sowie eine Erläuterung Ihres Codes bereitstellen, anstatt nur die rohe Quelle auszugeben. –

+0

Danke, der Code war ziemlich selbst erklärend, aber hier gehst du. –

0

hat Wir müssen das Datum des ersten Quartals erste

$current_month = date('m'); 

// Get first month of quarter 
$new_month = (3 * floor(($current_month - 1)/3)) + 1; 

// Add prefix zero if needed 
$new_month = substr('0' . $new_month, -2); 

$first_quarter_day_date = date('Y') . '-' . $new_month . '-01'; 

nächstes berechnen wir die http://php.net/manual/en/datetime.diff.php

berechnen
$datetime1 = new DateTime($first_quarter_day_date); 
$datetime2 = new DateTime(); 

$interval = $datetime1->diff($datetime2); 
echo $interval->format('%a days');