0

我过去使用过许多日期功能,但我需要有关特定功能的帮助...

是否有一个功能可以让我分配两个未知日期并且系统知道我在这两个日期内的位置?让我解释:

我们的月薪从每个月的 23 日到下个月的 22 日。因为收入按小时计算,所以我的老板想知道一个月内的任何地方的累积工资。例如,工资期从 2012 年 9 月 23 日开始,我们现在是 29 日,我希望我的查询能够知道我们在当前工资期的位置。

如您所知,几个月过去了,因此我的脚本必须自动知道我们现在处于哪个时期以及那个时期的哪个位置。

我可以围绕这个进行查询,我只需要知道用于分配这个数组的日期函数......

任何帮助将不胜感激 - Thanx

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 回答