2

我在这上面花了太多时间,但无法得到它。我正在寻找一个在给定日期时返回“字母日”的函数。

字母日是每周 6 天,从 A 到 F 不包括周末。如果星期一是 A,那么星期五是 E,下一个星期一是 F,星期二是 A。明白吗?

Week 1: a, b, c, d, e, null, null
Week 2: f, a, b, c, d, null, null
Week 3: e, f, a, b, c, null, null

选择一个任意日期作为参考。为了功能,让我们同意 4 月 22 日星期一是 C 日。

谢谢!

4

3 回答 3

1

这对你有用吗?

<?PHP
$datetime1 = new DateTime('2013-04-22');
$datetime2 = new DateTime('2013-04-30');
$interval = $datetime1->diff($datetime2);
$numDays = $interval->format('%d');

$calibration = 2; //April 22, 2013 is a "C" day.
$numWeekDays = $numDays - 2 * floor($numDays / 7);
$answer = ($numWeekDays + $calibration) % 6 + 1; 

echo chr(64 + $answer);
?>
于 2013-04-23T05:12:05.843 回答
0

这是想法:

for ($i = 0; $i < 100; $i++)
{
    if ($i % 7 == 0)
        echo "<BR>";
    echo GetLetter ($i) . ",";
}

function GetLetter ($numDays)
{
    $letters = Array ("A", "B", "C", "D", "E", "F");
    $nullRet = false;
    $currentLetter = 0;
    $lastLetter = 0;
    for ($i = 0; $i <= $numDays; $i++)
    {
        if (($i+2) % 7 == 0 || ($i+1) % 7 == 0)
        {
            $nullRet = true;
            continue;
        }
        else
        {
            $nullRet = false;
            $lastLetter = $currentLetter;
            $currentLetter++;
        }
    }
    if ($nullRet)
    {
        return "null";
    }
    else
    {
        return $letters[$lastLetter%6];
    }
}
?>

你能从中算出你自己的日期吗?从这里开始很容易。这个想法是你想循环一周中的几天,跳过坐着和太阳。您在所有其他日子递增并检查它们是什么 mod 6。

于 2013-04-23T03:02:29.193 回答
0
echo get_letter('29-4-2013');
echo get_letter('30-4-2013');
echo get_letter('1-5-2013');
echo get_letter('2-5-2013');
echo get_letter('3-5-2013');
echo PHP_EOL.'------------------'.PHP_EOL;
echo get_letter('6-5-2013');
echo get_letter('7-5-2013');
echo get_letter('8-5-2013');
echo get_letter('9-5-2013');
echo get_letter('10-5-2013');

function get_letter($set_date){
$map=array('a','b','c','d','e','f');

$start_letter = 'c';
$start_date = strtotime("22-4-2013");

$target_date = strtotime($set_date);

$start_date_w = date('w',$start_date);

$target_date_w = date('w',$target_date);

if($target_date_w == 6 || $target_date_w == 0){
return 'null';
}

$bwt_d = ($target_date-$start_date) / 86400;

$week_count =  floor($start_date_w + $bwt_d /7)-1;


$bwt_d5 = $bwt_d -$week_count*2;

$aa=($bwt_d5+1)%6;


return $map[$aa];
}

试试 http://sandbox.onlinephpfunctions.com/code/295d52d2ef2ecdbd7c2d2b93c747254e864fdf9c

于 2013-04-23T04:59:37.563 回答