5

我正在尝试运行具有两个我想调整的日期值的批处理脚本,然后再次运行该脚本。我想引用一个将为我调整这些日期值的 lua 脚本。我使用 lua 只是因为大部分项目都是用这种语言编码的。

如果我的变量是 start=01/01/2012 和 end=02/01/2012 我怎么能将这两个日期提前 14 天?然后我想让它运行,然后再次循环并再向前移动 14 天。这将一直持续到循环以我决定的日期中断。是否有可能以这种方式完成此操作,还是我接近此错误?

我想我可以用一个函数来做一些涉及 string.gsub 的事情,该函数会从我的日期中拉出“dd”并将其上移 14。但是,是否有可能进行这种日期算术,或者一旦我到达就会中断月底,它会尝试读取像 2012 年 1 月 45 日这样的日期?

4

2 回答 2

3

您的规范并不完全清楚。我想下面的脚本可能会有所帮助。诀窍是将您的日期转换为时间值,如 所返回的那样os.time,可以将其作为简单的数字进行比较。

为此,您首先必须解析日期的字符串形式,然后将它们转换为适合输入的表格形式os.time。请注意,增加这些表的字段(表示日期及其组件拆分)已经处理了时间算术,即指定一个day值为例如的字段32将在转换为时间值时正确换行到下个月。

当您到达目标日期时,您将时间值转换回您需要使用的格式的日期值os.date

local TARGET_DATE = "03/05/2012"

-- get the two dates from the command line of this lua script

local date1 = arg[1]
local date2 = arg[2]

date1 = "01/01/2012"    -- test data - remove in actual script
date2 = "02/01/2012"    -- test data - remove in actual script

-- parse the dates (assuming the format day/month/year)

local d1, m1, y1 = string.match( date1,  '^(%d%d)/(%d%d)/(%d%d%d%d)$' )
local d2, m2, y2 = string.match( date2,  '^(%d%d)/(%d%d)/(%d%d%d%d)$' )
local td, tm, ty = string.match( TARGET_DATE,  '^(%d%d)/(%d%d)/(%d%d%d%d)$' )

print( d1, m1, y1 ) -- debug
print( d2, m2, y2 ) -- debug
print( td, tm, ty ) -- debug

date1_tbl = { day = d1, month = m1, year = y1 }
date2_tbl = { day = d2, month = m2, year = y2 }

local time1 = os.time( date1_tbl )
local time2 = os.time( date2_tbl )
local target_time = os.time { day = td, month = tm, year = ty }

-- loop until both dates exceed target date
while time1 < target_time or time2 < target_time  do
    date1_tbl.day = date1_tbl.day + 14
    date2_tbl.day = date2_tbl.day + 14
    time1 = os.time( date1_tbl )
    time2 = os.time( date2_tbl )
end

-- rebuild new dates
local newdate1 = os.date( "%d/%m/%Y", time1 )
local newdate2 = os.date( "%d/%m/%Y", time2 )

print( newdate1 ) -- debug
print( newdate2 ) -- debug
于 2013-11-04T20:26:59.367 回答
0

您可能希望使用string.match进行解析,使用os.timeos.date来构造正确的新时间字符串(os.time 来处理将新添加的日期转换为正确的月/年和 os.date 来转换os.time 返回的时间再次转换为对人类友好的字符串/表格)以进行日期检查循环/停止。

于 2013-11-04T20:16:44.557 回答