1

我已经在MySQL 的日期和时间函数页面上寻找了很长一段时间,但是我找不到一个函数可以指示时间格式是否可以用于例如该STR_TO_DATE函数。用户提供了一种格式,我希望接受尽可能广泛的格式。该格式可以稍后在脚本中与 MySQL 的STR_TO_DATE函数一起使用,该函数反过来在失败时返回 NULL(这是我想避免的,通过在用户提供无效时间格式时预先警告用户)。我打算在临时表的帮助下以某种方式测试格式。

我无法使用该STR_TO_DATE函数测试格式的有效性,因为将传递给它的字符串值最终将由用户生成(在未来未定义的时间点),所以我不知道哪些字符串是将被传递给它。我曾希望该DATE_FORMAT函数可以解决我的问题,但它只是忽略了任何无效的格式说明符(例如,%Q没有任何意义,并将转换为Q)。在任何情况下都不会返回 NULL,也不会产生警告。

有任何想法吗?

编辑:我能想出的唯一大致可靠的解决方案是列出所有 MySQL 支持的格式说明符,并将这些说明符与用户提供的格式中存在的所有格式说明符进行比较。

preg_match_all("/(?:(?<!%)|(?<=%%))(?:%%)*%([^%])/", $format, $matches);

正则表达式列出了前面出现奇数个百分号的所有字符。(这是必要的,因为百分号会自行逃逸。)现在$matches[1]包含这些字符的列表。

4

3 回答 3

0

可以使用 MySQL 触发器来实现。

DELIMITER //
CREATE TRIGGER mytrigger BEFORE INSERT ON table_name
FOR EACH ROW BEGIN
IF (NEW.date_column REGEXP '^[0-9]{4}-[0-9]{2}-[0-9]{2}$') = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='Wrong Input';
END IF;
END //

DELIMITER;

这是一个示例集,它将检查格式为“YYYY-MM-DD”的用户输入,如果用户输入与指定的格式不同,则会抛出消息“错误输入” 。

正则表达式可以根据需要进行调整。

于 2013-09-15T09:04:08.017 回答
0

使用 Jquery 验证引擎从客户端验证日期格式。

从 PHP 你可以验证日期(MySQL 日期格式 '2013-09-14' )为

if(preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date)) {
    return true;
}
于 2013-09-15T06:20:47.900 回答
0

如果您想知道字符串是否仅包含有效的说明符,请创建 32 个格式说明符的列表...

a, b, c, d, D, e, f, h, H, i, I, j, k, l, m, M, p, r, s, S, T, u, U, v, V, w, W, x, X, y, Y, %

然后遍历格式字符串并检查有效的说明符......

// pseudo-code... pretend format is an array of the format's characters
function is_valid_format(format) {
  for (x = 0; x < format.length; ++x) 
    if (format[x] == "%" &&
        (x + 1 >= format.length || 
        specifiers does not contain format[x + 1])
      return false

  return true
}

您还可以考虑提供用户可以从中选择的预设日期格式字符串列表。除非用户记住了他们的格式字符串或记住了说明符,否则我更喜欢选择日期格式字符串。

于 2013-09-14T23:11:54.783 回答