Frage

PHP bietet Möglichkeiten, um die Nummer des aktuellen Tages des Monats (Datums ( ‚j‘)) sowie die Nummer des aktuellen Tages des Jahres (Datum ( ‚z‘)) zu erhalten. Gibt es eine Möglichkeit, die Anzahl der den aktuellen Tag des laufenden Quartals zu bekommen?

So jetzt, den 5. August, es ist Tag 36 des dritten Quartals.

Wenn es keine Standardmethode ist dies der Berechnung, hat jemand einen (prefereably PHP-basierte) Algorithmus zur Hand?

War es hilfreich?

Lösung 2

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

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

Andere Tipps

Wie wäre:

$curMonth = date("m", time());
$curQuarter = ceil($curMonth/3);
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;
}

Angenommen, Sie ein Kalender-Quartal bedeuten (weil ein Unternehmen des Geschäftsjahr in jedem Monat des Jahres beginnen kann), könnten Sie am Tag ( ‚z‘) verlassen, um das Tag-of-Jahr, um zu bestimmen, und dann einen Halt einfache Anordnung des Tages jedes Quartal 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 den Tag des Wirtschaftsjahres, dann subtrahieren.

Beachten Sie, dass Sie verschiedene Zahlen müssen auf dem Schaltjahr abhängig.

<?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";
?>

Sie können mit Carbon- es einfach Modifikatoren für getFirstOf {Monat, Jahr, Quartal} () hat

<?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;

Wir müssen das Datum des ersten Quartals berechnen ersten

$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

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

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

function quarter_day($time = "") {

    $time = $time ? strtotime($time) : time();
    $date = intval(date("j", $time));
    $month = intval(date("n", $time));
    $year = intval(date("Y", $time));

    // get selected quarter as number between 1 and 4
    $quarter = ceil($month / 3);

    // get first month of current quarter as number between 1 and 12
    $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 year is leap
    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 summing the relative portion of $map array
    $map[$month-1] = $date;
    $day = array_sum(array_slice($map, ($fmonth - 1), ($month - $fmonth + 1)));

    return "Day $day on $total of quarter $quarter, $year.";

}

print(quarter_day("2017-01-01")) . "\n"; // prints Day 1 on 90 of quarter 1, 2017.
print(quarter_day("2017-04-01")) . "\n"; // prints Day 1 on 91 of quarter 2, 2017.
print(quarter_day("2017-08-15")) . "\n"; // prints Day 46 on 92 of quarter 3, 2017.
print(quarter_day("2017-12-31")) . "\n"; // prints Day 92 on 92 of quarter 4, 2017.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top