0

過去に数多くの日付関数を使用してきましたが、特定の関数について助けが必要です...

不明な 2 つの日付を割り当てることができ、システムがこれら 2 つの日付内のどこにいるかを知る機能はありますか? 説明させてください:

私たちの月給は、毎月23日から翌月22日までです。収益は時間単位で計算されるため、上司はその月の累計給与がどこにあるかを知りたがっています。たとえば、給与期間は 2012 年 9 月 23 日に始まり、現在は 29 日です。現在の給与期間のどこにいるかをクエリで知ることができるようにしたいと考えています。

ご存じのように、月が経つにつれて、スクリプトは、現在の期間とその期間のどこにいるかを自動的に認識しなければなりません。

これに関するクエリを実行できます。この配列を割り当てるために使用する日付関数を知る必要があるだけです...

どんな助けでも大歓迎です-ありがとう

4

3 に答える 3

2

PHP のDateTimeクラスを使用して、これを非常に簡単に行うことができます。

$periodStart = new DateTime('23rd September');
$now = new DateTime();
$interval = $now->diff($periodStart);
echo "We are {$interval->d} days into the payment period";

出力:

支払い期限まであと6日です。

私はこの種のことのために DateTime クラスを拡張することを好むので、すべてが同じ場所にあります:-

class MyDateTime extends DateTime
{
    public function elapsedDays(DateTime $since = null)
    {
        if ($since === null) {
            $since = new DateTime();
        }
        $interval = $since->diff($this);
        return (int) $interval->d;
    }
}

$periodStart = new MyDateTime('23rd September');
echo "We are {$periodStart->elapsedDays()} days into the payment period";

同じ出力が得られます。

次に、期間と間隔を作成し、それを繰り返して合計を次のように集計できます。

$datePeriodStart = new DateTime('23rd September');
$datePeriodEnd   = clone $datePeriodStart;
$datePeriodEnd->add(new DateInterval('P1M'));

$dateToday = new DateTime();
$interval1 = $dateToday->diff($datePeriodStart);
$interval2 = $dateToday->diff($datePeriodEnd);

echo "We are {$interval1->d} day(s) into the payment period, {$interval2->d} day(s) left.\n";

$period = new DatePeriod($datePeriodStart, new DateInterval('P1D'), $dateToday);
$days = new IteratorIterator($period);

$totalSalary = 0;
$totalDays = 0;
foreach($days as $day)
{
    $salary = get_salary_for_day($day);

    $totalSalary += $salary;
    $totalDays++;

    printf("#%d: %s %s\n", $totalDays, $day->format('Y-m-d'), number_format($salary));
}

printf("Total Salary for %d day(s): %s\n", $totalDays, number_format($totalSalary));

出力例:

We are 6 day(s) into the payment period, 23 day(s) left.
#1: 2012-09-23 12,500
#2: 2012-09-24 12,500
#3: 2012-09-25 12,500
#4: 2012-09-26 12,500
#5: 2012-09-27 12,500
#6: 2012-09-28 12,500
#7: 2012-09-29 12,500
Total Salary for 7 day(s): 87,500
于 2012-09-29T14:33:44.353 に答える
0

単純に TIMESTAMP 値 (エポックからの秒数、「UNIX タイムスタンプ」とも呼ばれます) を使用して、UNIX タイムスタンプの現在の日付が最初と最後の UNIX タイムスタンプの日付の間にあるかどうかをテストするだけです。

基本的に、この方法では、日付を大きな整数 (1969/70 からの秒数) に変換するだけで、算術関数とテスト関数の処理が非常に簡単になります。

于 2012-09-29T14:28:43.540 に答える
0

FROM と TO の日付を取得:

$to = new DateTime();
$from = new DateTime($to->format('Y-m-23'));
if ($to->format('j') < 23) {
    $from->modify('-1 month');
}

Var_dump:

var_dump($from->format('Y-m-d')); # 2012-09-23
var_dump($to->format('Y-m-d')); # 2012-09-29

SQL

$sql = "
    SELECT ...
    FROM ...
    WHERE some_time BETWEEN '" . $from->format('Y-m-d') . "' AND '" . $to->format('Y-m-d') ."'
";
于 2012-09-29T14:46:03.730 に答える