【问题标题】:Calculating and storing future time and dates in PHP/MySQL在 PHP/MySQL 中计算和存储未来的时间和日期
【发布时间】:2013-02-27 12:11:45
【问题描述】:

我需要为我的用户提供一种选择未来几天(包括今天)上午 11 点和下午 4 点时间段的方法,共有 8 个选项。当然,如果今天已经过了上午 11 点或下午 4 点,那么我不应该向他们显示过期选项。

因此,例如,如果现在是 2 月 28 日中午,那么我需要向用户显示以下 8 个选项:

28-Feb-13 at 4pm 
01-Mar-13 at 11am 
01-Mar-13 at 4pm 
02-Mar-13 at 11am 
02-Mar-13 at 4pm 
03-Mar-13 at 11am 
03-Mar-13 at 4pm 
04-Mar-13 at 11am

另外,我需要一种将这些选项存储在 MySQL 中的方法,以便我现在可以知道他们选择的日期/时间并将其与注册信息一起保存到数据库中。

这听起来很容易用语言解释,但我很难弄清楚如何用 PHP 编程。

我将如何使用DateTime() 类来做到这一点?

【问题讨论】:

  • 检查当前时间并写下条件..即,如果当前时间
  • @User:我如何检查它是
  • 是否考虑过周末?节假日?
  • 在php中使用datetime类及其函数

标签: php mysql date datetime time


【解决方案1】:
<?php

$hours = array(11,16);
$outputCount = 8;

$now = new DateTime();
$t = clone $now;

$dates = array();
$i=0;

while (count($dates)<$outputCount) {
    $t->setTime($hours[++$i % count($hours)],0,0);
    if ($t>$now) {
        $dates[] = clone $t;
    }
    if ($t->format('G') == max($hours)) {
        $t->modify('+1 day');
    }
}

print_r($dates);

【讨论】:

  • 非常有趣且简洁的解决方案,谢谢!几个问题:1) 如何设置此代码以在特定时区工作? 2) 如果我需要下午 4:30 而不是下午 4 点,我该怎么做? 3) 我应该如何在 MySQL 中使用正确的时区保存这些时间/日期?
  • 您可以在 php.ini 文件中设置时区,或者在开头的 $now 对象上覆盖它。您必须创建一个与 $hours 数组大小相同的 $minutes 数组,您可以使用 $i 从该数组中提取数据。 MySQL不会记录时区,只是一个时间。如果您希望不同的用户查看不同时区的日期,则必须在前端处理该问题,并将所有后端数据的存储标准化为单个时区。
【解决方案2】:

您只需创建一个“现在”的日期时间,然后检查您是否在上午 11 点之前,然后决定将您的时间移动到上午 11 点或下午 4 点,然后增加以检索您的 8 个值。

这是一段可以处理这些东西的代码:

// create a "now" date time
$now = new DateTime();

// create a "now at 11am" date time
$nowAt11am = new DateTime();
$nowAt11am->setTime(11, 0, 0);

// Compare the interval between now and now at 11am
$interval = $now->diff($nowAt11am);

// Initialize the increment even/odd
$incementEvenOdd = 0;

// Check interval
if ($interval->invert == 1)
{
    // $interval < 0 => we are before $nowAt11am, set to 11 am
    $now = $nowAt11am;
    $incementEvenOdd = 0;
}
else
{
    // $interval > 0 => we are after $nowAt11am, set to 4 pm
    $now->setTime(16, 0, 0);
    $incementEvenOdd = 1;
}

$dayAndHours = array();
$dayAndHours[] = $now->format("your_desire_format");

// Loop and add the next 7 dates
for($i = 0 ; $i < 7 ; $i++)
{
    // Handle the delay between 11 am and 4 pm
    // 11am -> 4pm = + 5h
    // 4pm -> 11am = + 19h

    if ($incementEvenOdd % 2 == 0)
        $now->add(DateInterval::createFromDateString('5 hours'));
    else
        $now->add(DateInterval::createFromDateString('19 hours'));

    // Appen the next value
    $dayAndHours[] = $now->format("your_desire_format");

    // Update increment
    $incrementEvenOdd++;
}

【讨论】:

  • 非常有趣,谢谢。您的代码中存在变量“incementEvenOdd”和“incRementEvenOdd”的错字,但除此之外,它有效!几个问题:1)如何设置此代码以在特定时区上工作? 2) 如果不是 5 小时,我需要增加 5 个半小时 来使下午时间 4:30pm,怎么办?我这样做? 3) 我应该如何在 MySQL 中保存这些时间/日期?
  • 1) 查看 DateTime 类:php.net/manual/en/class.datetime.php。你有一个时区,你可以在构造函数上给出。 2) 在此处查看DateInterval::createFromDateString 的可用格式列表:php.net/manual/en/datetime.formats.relative.php。我想你可以使用DateInterval::createFromDateString('5 hours 30 minutes')。 3) 创建所有“日期”后,您可以使用 SQL 请求插入它们。 4)如果它对你有好处,请投票或标记为解决方案;)
【解决方案3】:

请尝试下面的代码,我会将 DATETIME 存储在 DB 中: 您可以根据自己的需要进行优化,它应该为您提供基本的逻辑概念:

<?php
    $end_date = mktime(0, 0, 0, date("m")  , date("d")+4, date("Y"));
    $cnt = 0;
    $day = 0;

    $current_hour = date("H");
    // To test with various values, uncomment below line and assign any hour
    // $current_hour = "12";


    if($current_hour < 11)
    {
        $day = 0;
        $ts =  mktime(11, 0, 0, date("m")  , date("d"), date("Y"));
        echo "<br>".date("Y-m-d H:i:s",$ts);
        $ts =  mktime(16, 0, 0, date("m")  , date("d"), date("Y"));
        echo "<br>".date("Y-m-d H:i:s",$ts);
        $cnt = 2;
        $day = $day + 1;
    }
    elseif($current_hour < 16)
    {
        $day = 0;
        $ts =  mktime(16, 0, 0, date("m")  , date("d")+$day, date("Y"));
        echo "<br>".date("Y-m-d H:i:s",$ts);
        $cnt = 1;
        $day = $day + 1;
    }
    elseif($current_hour >= 16)
    {

        $day = $day + 1;
    }


    while($cnt <= 8)
    {
        $ts =  mktime(11, 0, 0, date("m")  , date("d")+$day, date("Y"));
        echo "<br>".date("Y-m-d H:i:s",$ts);
        $cnt = $cnt + 1;
        if($cnt >=8) break;

        $ts =  mktime(16, 0, 0, date("m")  , date("d")+$day, date("Y"));
        echo "<br>".date("Y-m-d H:i:s",$ts);    
        $cnt = $cnt + 1;
        $day = $day + 1;
        if($cnt >=8) break;
    }

    ?>

【讨论】:

    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    相关资源
    最近更新 更多