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

Validation 如何在Lua中验证字符串是否为有效日期?,validation,date,lua,Validation,Date,Lua,s=“2/29/2010” 如何验证上述字符串是否为Lua中的有效日期?标准Lua库中没有此类内容,但您可以自己轻松创建: function is_valid_date(str) -- perhaps some sanity checks to see if `str` really is a date local m, d, y = str:match("(%d+)/(%d+)/(%d+)") m, d, y = tonumber(m), tonumber(d), tonum

s=“2/29/2010”


如何验证上述字符串是否为Lua中的有效日期?

标准Lua库中没有此类内容,但您可以自己轻松创建:

function is_valid_date(str)

  -- perhaps some sanity checks to see if `str` really is a date

  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
    -- Cases that don't make sense
    return false
  elseif m == 4 or m == 6 or m == 9 or m == 11 then 
    -- Apr, Jun, Sep, Nov can have at most 30 days
    return d <= 30
  elseif m == 2 then
    -- Feb
    if y%400 == 0 or (y%100 ~= 0 and y%4 == 0) then
      -- if leap year, days can be at most 29
      return d <= 29
    else
      -- else 28 days is the max
      return d <= 28
    end
  else 
    -- all other months can have at most 31 days
    return d <= 31
  end

end
函数为有效日期(str)
--也许需要做些精神检查,看看str是否真的是一个约会
本地m,d,y=str:match((%d+)/(%d+/(%d+)/(%d+))
m、 d,y=色调(m),色调(d),色调(y)
如果d<0或d>31或m<0或m>12或y<0,则
--没有意义的案例
返回错误
如果m==4或m==6或m==9或m==11,则
--4月、6月、9月、11月最多可有30天

return d标准Lua库中没有这样的东西,但是可以自己轻松创建:

function is_valid_date(str)

  -- perhaps some sanity checks to see if `str` really is a date

  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
    -- Cases that don't make sense
    return false
  elseif m == 4 or m == 6 or m == 9 or m == 11 then 
    -- Apr, Jun, Sep, Nov can have at most 30 days
    return d <= 30
  elseif m == 2 then
    -- Feb
    if y%400 == 0 or (y%100 ~= 0 and y%4 == 0) then
      -- if leap year, days can be at most 29
      return d <= 29
    else
      -- else 28 days is the max
      return d <= 28
    end
  else 
    -- all other months can have at most 31 days
    return d <= 31
  end

end
函数为有效日期(str)
--也许需要做些精神检查,看看str是否真的是一个约会
本地m,d,y=str:match((%d+)/(%d+/(%d+)/(%d+))
m、 d,y=色调(m),色调(d),色调(y)
如果d<0或d>31或m<0或m>12或y<0,则
--没有意义的案例
返回错误
如果m==4或m==6或m==9或m==11,则
--4月、6月、9月、11月最多可有30天

返回d虽然Bart Kier的回答在逻辑上是有组织的、呈现的和清晰的,但它允许零值的无意义日期通过验证,如'00/12/2011'和'02/00/2012'。我在下面修改了“”,虽然巴特·基尔的回答是有逻辑的、有条理的、清晰的,但它允许零值的无意义日期通过验证,如“00/12/2011”和“02/00/2012”。我在下面修改了“”,杰夫·德拉姆和巴特·基尔的答案没有考虑到字符串可能根本不是日期。我添加了返回false的代码,以防在下面的代码中找不到Jeff Drumms的答案中的年/月/日期

function IsValidDate(str)
  -- perhaps some sanity checks to see if `str` really is a date
  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
    -- Cases that don't make sense
    return false
  elseif m == 4 or m == 6 or m == 9 or m == 11 then 
    -- Apr, Jun, Sep, Nov can have at most 30 days
    return d <= 30
  elseif m == 2 then
    -- Feb
    if y%400 == 0 or (y%100 ~= 0 and y%4 == 0) then
      -- if leap year, days can be at most 29
      return d <= 29
    else
      -- else 28 days is the max
      return d <= 28
    end
  else 
    -- all other months can have at most 31 days
    return d <= 31
  end
end
函数IsValidDate(str)
--也许需要做些精神检查,看看str是否真的是一个约会
本地y,m,d=str:match((%d+)/(%d+)/(%d+))
如果y==nil或m==nil或d==nil
然后
返回错误
结束
m、 d,y=色调(m),色调(d),色调(y)

如果d31或m12或y杰夫·德拉姆和巴特·基尔的答案没有考虑到字符串可能根本不是日期。我添加了返回false的代码,以防在下面的代码中找不到Jeff Drumms的答案中的年/月/日期

function IsValidDate(str)
  -- perhaps some sanity checks to see if `str` really is a date
  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
    -- Cases that don't make sense
    return false
  elseif m == 4 or m == 6 or m == 9 or m == 11 then 
    -- Apr, Jun, Sep, Nov can have at most 30 days
    return d <= 30
  elseif m == 2 then
    -- Feb
    if y%400 == 0 or (y%100 ~= 0 and y%4 == 0) then
      -- if leap year, days can be at most 29
      return d <= 29
    else
      -- else 28 days is the max
      return d <= 28
    end
  else 
    -- all other months can have at most 31 days
    return d <= 31
  end
end
函数IsValidDate(str)
--也许需要做些精神检查,看看str是否真的是一个约会
本地y,m,d=str:match((%d+)/(%d+)/(%d+))
如果y==nil或m==nil或d==nil
然后
返回错误
结束
m、 d,y=色调(m),色调(d),色调(y)

如果d 31或m 12或y fyi“else”在返回后是多余的。ie
if(x)then return y否则返回z end
可以简化为
if(x)then return y end返回z
。适用于所有语言。这是我最讨厌的东西之一。顺便说一句,努力+1:)非常感谢,这正是我想要的。仅供参考,返回后“其他”是多余的。ie
if(x)then return y否则返回z end
可以简化为
if(x)then return y end返回z
。适用于所有语言。这是我最讨厌的事情之一。顺便说一句:)多谢,这正是我想要的。所谓“有效”,我想你的意思是“这是地球上唯一一个在写日期时使用延迟格式mm/dd/yyyyy而不是逻辑级数dd/mm/yyyyy或iso标准yyyyy/mm/dd的国家的有效日期吗?”我认为Lua中可能有一个标准库函数,用于验证日期是否是字符串表示中的有效日期。例如,2010年2月29日是有效日期还是无效日期。通过“有效”,我假设您的意思是“这是地球上唯一一个在写入日期时使用延迟格式mm/dd/yyyy而不是逻辑级数dd/mm/yyyy或iso标准yyyy/mm/dd的国家的有效日期吗?”我认为Lua中可能有一个标准库函数,用于验证日期是否是字符串表示中的有效日期。例如,2010年2月29日是否为有效日期。
function IsValidDate(str)
  -- perhaps some sanity checks to see if `str` really is a date
  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
    -- Cases that don't make sense
    return false
  elseif m == 4 or m == 6 or m == 9 or m == 11 then 
    -- Apr, Jun, Sep, Nov can have at most 30 days
    return d <= 30
  elseif m == 2 then
    -- Feb
    if y%400 == 0 or (y%100 ~= 0 and y%4 == 0) then
      -- if leap year, days can be at most 29
      return d <= 29
    else
      -- else 28 days is the max
      return d <= 28
    end
  else 
    -- all other months can have at most 31 days
    return d <= 31
  end
end