【问题标题】:Validating a date without knowing its format在不知道其格式的情况下验证日期
【发布时间】:2013-03-18 07:06:22
【问题描述】:

我正在为验证库进行日期验证。日期格式和包含要验证的日期的变量将提供给库。

$validator->validate( $_POST['date'], 'm/d/y' );

使用DateTime::createFromFormat() 进行基本验证非常容易

if ( DateTime::createFromFormat( $format, $date ) !== false ) {
    // "valid" date
}

我的问题是,使用此方法无效的日期,例如 23/23/23 过去,因为 DateTime 类将移动日期并将其设置为 2024-11-23。我知道checkdate() 的存在,但不知道格式我看不到提取原始月/日/年的方法。

关于如何验证这样的日期的任何想法?

【问题讨论】:

  • 是否有机会限制可能的日期字符串的变体?
  • @axel.michel - 我宁愿不
  • 如果您不知道格式,那么您会产生歧义。 1/2/13 是 2 月 1 日(欧洲格式)还是 1 月 2 日(美国格式)?您可以明确地解决一些问题,例如 23/9/13,但每个月的前 12 天都是模棱两可的。这不包括以 2 位数年份开头的日期:13/1/2 = 2013 年 1 月 2 日。

标签: php validation date datetime language-agnostic


【解决方案1】:

既然你不知道日期的格式,那么你应该使用date_parse

date_parse — 返回关联数组以及给定日期的详细信息

示例

print_r(date_parse("23/23/23 00:14:38"));

输出

Array
(
    [year] => 2023
    [month] => 3            <------------------- Attempts to correct month 
    [day] => 23
    [hour] => 0
    [minute] => 14
    [second] => 38
    [fraction] => 0
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 1
    [errors] => Array
        (
            [0] => Unexpected character        <----- add errors found 
        )

    [is_localtime] => 
)

简单类

$date = "23/3/2013 00:14:38";
if (DateTimeParse::createFromString($date) !== false) {
    // "valid" date
}

使用的类

class DateTimeParse {

    public static function createFromString($string) {
        $date = date_parse(str_replace("/", "-", $string));
        if ($date['error_count'] > 0)
            return false;
        $date = sprintf("%d-%d-%d %d:%d:%d", $date['year'], $date['month'], $date['day'], $date['hour'], $date['minute'], $date['second']);
        return \DateTime::createFromFormat("Y-m-d g:i:s", $date);
    }
}

【讨论】:

  • 我认为他的问题不完全是关于 23/23/23...10/10/10 不知道它的格式怎么样
  • 似乎检查没有从 date_parse 返回的警告或错误就可以了。
  • @Galen 不要忘记将/ 转换为- .. 使用date_parse 时,-: 效果更好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2011-12-29
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2017-11-16
相关资源
最近更新 更多