1

日付を入力するテキストボックスがあります。

ユーザーが入力した日付が将来のものか今日のものかを確認するには、どのようなコードが必要ですか?

また、ユーザーに日付を dd/mm/yyyy 形式で入力してもらいたいです。

それらのいずれかが失敗した場合、コードはエラーを返します。

4

3 に答える 3

5

DateTimeクラスを使用して、この比較を行うこともできます。

$now       = new DateTime();
$user_date = DateTime::createFromFormat('d/m/Y', $userDate);
if ($user_date >= $now)
{
     echo 'Date is not in the past';   
}
于 2012-10-18T11:24:23.307 に答える
0

この解決策をお勧めします:

/**
 * Is future date
 *
 * Checks if given date is today
 * or in the future.
 *
 * @param string $date
 *
 *
 * @return bool
 *
 */
protected function isFutureDate($date)
{
    // assuming the date is in this format
    // (I use value objects for these things so that
    // I don't have to repeat myself)

    $date = DateTimeImmutable::createFromFormat('d-m-Y', $date);
    $today = DateTimeImmutable::createFromMutable(new DateTime());
    return $date->getTimestamp() >= $today->getTimestamp();
}

他の日付クラスによって拡張された次の Date オブジェクトを使用します。他の日付クラスには、この基本クラスから拡張された独自のルール (日付は将来でなければならないなど) があります。

/**
 * Class DateValueObject
 *
 * 
 *
 * @package Hidden\Model\Shared\ValueObject
 *
 */
abstract class DateValueObject extends ValueObject
    implements DateValueObjectContract
{

    /**
     * @var DateValueObject
     *
     */
    protected $value;


    /**
     * Initialises the Date.
     *
     * @param $date
     *
     * @throws InvalidDateException
     *
     */
    public function __construct($date)
    {
        if (is_string($date)) {
            $this->value = $this->setDate($date);
        } else {
            throw new InvalidDateException(
                'String Expected. Got: ' .$date
            );
        }
    }


    /**
     * Set valid date.
     *
     * @param string $date
     *
     * @return DateTimeImmutable
     *
     * @throws InvalidDateException
     */
    protected function setDate($date)
    {
        try {
            $d = DateTimeImmutable::createFromFormat('d-m-Y', $date);
            if($d && $d->format('d-m-Y') == $date) {
                return $d;
            } else {
                $d = DateTimeImmutable::createFromFormat('d/m/Y', $date);
                if($d && $d->format('d/m/Y') == $date) {
                    return $d;
                }
                throw new InvalidDateException(
                    'Date cannot be formatted: ' .$date
                );
            }
        } catch (\Exception $e) {
            throw new InvalidDateException(
                'For date: ' .$date .' with message' .$e->getMessage()
            );
        }
    }



    /**
     * Get the date to string
     *
     * @param string $format
     *
     * @return string
     *
     */
    public function toString($format = 'd/m/Y')
    {
        return $this->value->format($format);
    }


    /**
     * Get the date as immutable object.
     *
     *
     * @return DateTimeImmutable|Date
     *
     */
    public function toDateObject()
    {
        return $this->value;
    }
}

編集: コードの最初のブロックは、日付が未来かどうかをチェックすることに注意してください。コードを繰り返します。代わりにこれをメソッドに入れて、必要なたびにコピーして貼り付け続けるか、それ以外の場合は単に拡張するだけで、全体的に機能することがわかります。

私の例では、「dmY」と「d/m/Y」の両方を受け入れ、それに応じてフォーマットを処理します。結局のところ、php DateTimeImmutable オブジェクトはまだありますが、それ自体を構築する方法を知っているオブジェクトです。

于 2015-11-26T07:12:39.737 に答える
0

使用する

int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )

マニュアルページから

パラメータを入力して減算します

time()

ゼロより大きい場合、それは未来です

于 2012-06-28T05:53:27.337 に答える