Цикл манипулирования датой в Lua

Я пытаюсь запустить пакетный скрипт с двумя значениями даты, которые я хотел бы настроить, а затем снова запустить скрипт. Я хотел бы сослаться на сценарий lua, который изменит эти значения даты для меня. Я использую lua просто потому, что большая часть проекта написана на этом языке.

Если бы мои переменные были start=01/01/2012 и end=01/02/2012, как я мог перенести обе эти даты на 14 дней вперед? Затем я хотел бы запустить его, затем снова зациклить и переместить оба вперед ДРУГИЕ 14 дней. Это будет продолжаться до тех пор, пока цикл не прервется с датой, которую я решу. Можно ли сделать это таким образом, или я подхожу к этому неправильно?

Я полагаю, что мог бы сделать что-то с использованием string.gsub с функцией, которая вытащила бы «дд» из моих дат и переместила бы это на 14. Однако возможно ли выполнить такую ​​​​арифметику дат или это сломается, как только я достигну конец месяца, и он попытается прочитать дату, например, 45.01.2012?


person MRCLE    schedule 04.11.2013    source источник


Ответы (2)


Ваша спецификация не совсем ясна. Я предполагаю, что следующий сценарий может быть полезен. Хитрость заключается в том, чтобы преобразовать ваши даты в значения времени, возвращаемые 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
person Lorenzo Donati -- Codidact.com    schedule 04.11.2013
comment
Извините, я не совсем ясно выразился в своем первоначальном сообщении. Это было очень полезно и соответствовало тому, чего я пытался достичь. Целью в этом контексте будет перемещение date1 и date2 вперед на 14 дней за раз и цикл, пока не будет достигнута целевая дата. Часть восстановления новых дат - это то, к чему я не понял, как подойти. Спасибо за помощь, я новичок в lua и не был уверен, какие функции я мог бы использовать, в частности, os.time/date были тем, что я искал. Это также отвечает на мой вопрос об арифметике дат, я не был уверен, что таблица lua может это сделать. - person MRCLE; 05.11.2013
comment
@user2943428 user2943428 Тогда добро пожаловать в Stack Overflow! Не забудьте прочитать страницы tour и справочного центра, если вы еще не сделали этого. Более того, страница Как задавать вопросы поможет вам научиться задавать хорошие вопросы. И не забудьте принять ответ, который помог вам больше всего (вы можете немного подождать, прежде чем принять ответ, чтобы увидеть, опубликован ли лучший ответ). Кроме того, когда вы достигнете достаточной репутации, вы также сможете проголосовать за вопрос или ответ, если сочтете их полезными. Это механизм, который помогает поддерживать высокое качество SO. - person Lorenzo Donati -- Codidact.com; 05.11.2013
comment
@user2943428 user2943428 о вашем последнем комментарии: я не был уверен, что таблица lua может это сделать. Для справки: это не механизм, связанный с таблицами Lua. Это os.time, который обрабатывает это внутри. Таблицы Lua — это просто структура данных, используемая для хранения данных, с которыми работает os.time. - person Lorenzo Donati -- Codidact.com; 05.11.2013
comment
Спасибо за прием, очень признателен. И чтобы прояснить этот последний момент, касающийся os.time, понимает ли эта функция os.time входные данные дня, месяца и года для того, что они собой представляют? Или эти переменные определяются и вызываются позже? - person MRCLE; 05.11.2013
comment
Непонятно, что вы подразумеваете под тем, понимает ли эта функция os.time ввод дня, месяца и года для того, что они собой представляют. Может быть, вам лучше прочитать документацию, на которую я ссылался в своем ответе, и посмотреть, имеет ли это смысл для вас. Вкратце: os.time берет предоставленную таблицу и использует ее поля для определения соответствующего значения времени. Он не хранит ничего, что вы ему передаете. - person Lorenzo Donati -- Codidact.com; 05.11.2013
comment
Да, спасибо, документация прояснила это для меня. Мой вопрос заключался в том, понимает ли os.time значение каждого поля, т.е. дни могут быть (1-31) месяцами (1-12), а годы - четырьмя цифрами и т. д. Я не знал, были ли это поля, специфичные для os.time или если бы это были переменные, которые мы определяли - person MRCLE; 05.11.2013

Скорее всего, вы захотите использовать string.match для синтаксический анализ и os.time и os.date, чтобы создать правильную новую строку времени (os.time для обработки преобразование вашей новой добавленной даты в правильный месяц/год и os.date, чтобы снова превратить время, возвращаемое os.time, в удобную для человека строку/таблицу), чтобы выполнить зацикливание/остановку проверки даты.

person Etan Reisner    schedule 04.11.2013