PHP中的日期对我来说是一场噩梦,所以请帮助我…我想通知客户他们的订单将会在哪一天送达。它是这样工作的:
我有两个发货区,A区和B区。A区的订单每周一、周三和周五发货,而B区的订单是周二、周四和周六。对于每个订单,根据区域的不同,发货日期安排在下一个可用日期。请考虑,如果某人在周一下单,货物将在下一个可用日期发货,即B区为周二,A区为周三。
如何计算下一个可用交货日期并通知客户?
谢谢。
发布于 2011-09-08 22:05:43
试试这个:
// Info
$date = array(date("d"), date("m"), date("Y"));
$zone = "A";
// ------
$zones = array("A" => array(1 => "Monday",
3 => "Wednesday",
5 => "Friday")
,"B" => array(2 => "Tuesday",
4 => "Thursday",
6 => "Saturday"));
$found = false;
$days_plus = 1; // always next day
// Retrieve last day from the zone
end($zones[$zone]);
$last_day = key($zones[$zone]);
do {
$mk = mktime(0, 0, 0, $date[1], ($date[0] + $days_plus), $date[2]);
$week = date("w", $mk);
// if week not passed last day of zone
if ($week <= $last_day)
{
if (!isset($zones[$zone][$week]))
{
$days_plus++;
}
else
{
$found = true;
}
}
else
{
$days_plus++;
}
} while (!$found);
echo "Next date: " . date("d/m/Y - l", $mk);发布于 2011-09-08 18:36:57
这肯定不是最快或最聪明的答案,但阅读代码将是一种乐趣。
假设我们在A区发货:
$dates = array(
new DateTime('next monday'), // magic!
new DateTime('next wednesday'),
new DateTime('next friday'),
);
// Seems to work because since PHP 5.2.2 DateTime objects
// can be compared with the < and > operators
$shippingDate = min($dates);
echo $shippingDate->format('Y-m-d');你可能想看看PHP中可用的relative date formats,这就是“下周一”魔术发生的地方。有关可以使用$shippingDate执行哪些操作的信息,请参阅有关DateTime类的文档。
更新
为了完整,这里是一个更老式的版本,它不需要PHP 5.3,也应该更快(尽管速度在这里实际上是无关紧要的)。我不太喜欢它,因为要验证它是否正常工作并不容易。与上面的版本相比,这个版本在我第一次写它的时候有一个bug。简单就是好的。
$today = date('w');
// These values are from http://www.php.net/manual/en/function.date.php
$shippingDays = array(
1, // mon
3, // wed
5, // fri
);
// Each of these weekdays is how many days into the future?
foreach($shippingDays as &$day) {
$day = (7 + $day - $today) % 7;
}
// Get the earliest one, but not if it's today
// array_filter is used to remove a possible 0
$daysInFuture = min(array_filter($shippingDays));
$shippingDate = new DateTime('+'.$daysInFuture.' days');
echo $shippingDate->format('Y-m-d');。
发布于 2011-09-08 18:40:53
$timestamp = strtotime('next Monday');
$date = date('Y-m-d', $timestamp);https://stackoverflow.com/questions/7346555
复制相似问题