如何在Lua中验证一个字符串是否为有效的日期?

如何在 Lua 中验证上述字符串是一个有效的日期?

点赞
用户50476
用户50476

在标准 Lua 库中没有这样的函数,但是你可以很容易地创建自己的函数:

function is_valid_date(str)

  -- 可以添加一些检查,确保 `str` 是一个合法的日期字符串

  local m, d, y = str:match("(%d+)/(%d+)/(%d+)")

  m, d, y = tonumber(m), tonumber(d), tonumber(y)

  if d < 0 or d > 31 or m < 0 or m > 12 or y < 0 then
    -- 日期值不合理
    return false
  elseif m == 4 or m == 6 or m == 9 or m == 11 then
    -- 四月、六月、九月和十一月的最多只有30天
    return d <= 30
  elseif m == 2 then
    -- 二月
    if y%400 == 0 or (y%100 ~= 0 and y%4 == 0) then
      -- 如果是闰年,则最多可以有29天
      return d <= 29
    else
      -- 否则最多有 28 天
      return d <= 28
    end
  else
    -- 其他月份最多只有31天
    return d <= 31
  end

end

(未经测试!)

或者搜索 "lua date parsing" 来找第三方库来替代实现。

2012-09-22 11:01:03
用户1195678
用户1195678
函数 `checkDate(us_mdY)`

用途:检查传入的日期字符串是否是有效的日期格式,并且是否等于该日期在美国格式下的零时零分零秒

参数:us_mdY - 要检查的日期字符串,格式为 `月/日/年` (例如: 02/14/2022)

返回值:如果日期字符串是有效的日期格式,并且等于该日期在美国格式下的零时零分零秒,则返回 `true`,否则返回 `false`。

具体实现如下:

local m, d, Y = us_mdY:match("(%d+)/(%d+)/(%d+)") -- 从传入的日期字符串中提取出月、日、年 local epoch = os.time{year=Y, month=m, day=d} -- 根据提取到的年、月、日计算出时间戳 local zeromdy = string.format("%02d/%02d/%04d", m, d, Y) -- 将月、日、年按照规定格式拼接成新的日期字符串 return zeromdy == os.date('%m/%d/%Y', epoch) -- 判断新拼接的日期字符串是否等于通过时间戳获取到的美国格式日期字符串


例如:

checkDate("02/14/2022") -- 返回 true checkDate("14/02/2022") -- 返回 false ```

2013-11-06 19:50:24
用户1265227
用户1265227
function isdate(value)
    -- 检查是否为英国日期格式 dd/mm/yyyy,dd-mm-yyyy,dd.mm.yyyy
    -- 我的应用需要文本响应,请根据需要更改返回值为 true / false
    if (string.match(value, "^%d+%p%d+%p%d%d%d%d$")) then
        local d, m, y = string.match(value, "(%d+)%p(%d+)%p(%d+)")
        d, m, y = tonumber(d), tonumber(m), tonumber(y)

        local dm2 = d*m*m
        if  d>31 or m>12 or dm2==0 or dm2==116 or dm2==120 or dm2==124 or dm2==496 or dm2==1116 or dm2==2511 or dm2==3751 then
            -- 无效,除非闰年
            if dm2==116 and (y%400 == 0 or (y%100 ~= 0 and y%4 == 0)) then
                return "valid"
            else
                return "invalid"
            end
        else
            return "valid"
        end
    else
        return "invalid"
    end
end
2014-02-06 00:05:28
用户3722799
用户3722799

虽然Bart Kier的答案组织、呈现和清晰,但它允许无意义的日期通过验证,例如“00/12/2011”和“02/00/2012”。我通过将月份、日和年的 '<' 检查改为 '<=' 来纠正它。

function is_valid_date(str)

  -- 可能需要一些检查以查看`str`是否真的是一种日期

  local m, d, y = str:match("(%d+)/(%d+)/(%d+)")

  m, d, y = tonumber(m), tonumber(d), tonumber(y)

  if d <= 0 or d > 31 or m <= 0 or m > 12 or y <= 0 then
    -- 无意义的日期
    return false
  elseif m == 4 or m == 6 or m == 9 or m == 11 then
    -- 四月、六月、九月、十一月最多只有30天
    return d <= 30
  elseif m == 2 then
    -- 二月
    if y%400 == 0 or (y%100 ~= 0 and y%4 == 0) then
      -- 闰年的话,最多有29天
      return d <= 29
    else
      -- 否则最多28天
      return d <= 28
    end
  else
    -- 所有其他月份最多只有31天
    return d <= 31
  end
end
2014-06-09 14:55:29
用户1228462
用户1228462

Jeff Drumm和Bart Kier没有考虑到字符串可能根本不是一个日期。我在下面的代码中添加了一个条件来返回false,以便处理Jeff Drumm的答案。

function IsValidDate(str)
  -- 可能需要一些检查来确保“str”确实是一个日期
  local y, m, d = str:match("(%d+)/(%d+)/(%d+)")
  if y == nil or m == nil or d == nil
  then
    return false
  end
  m, d, y = tonumber(m), tonumber(d), tonumber(y)

  if d <= 0 or d > 31 or m <= 0 or m > 12 or y <= 0 then
    -- 不合理的情况
    return false
  elseif m == 4 or m == 6 or m == 9 or m == 11 then
    -- 四月、六月、九月和十一月最多只有30天
    return d <= 30
  elseif m == 2 then
    -- 二月
    if y%400 == 0 or (y%100 ~= 0 and y%4 == 0) then
      -- 如果是闰年,则天数最多为29天
      return d <= 29
    else
      -- 否则,最多为28天
      return d <= 28
    end
  else
    -- 所有其他月份最多有31天
    return d <= 31
  end
end
2016-05-01 19:40:55