Обсуждение программ nnCron и nnCron LITE
by SlavaZoid » Wed, 13 Jul 2005, 13:02
Привет, All!
Среди внушительного описания Cron-формата не нашел как указать в качестве момента времени запуска задачи "последний рабочий день месяца"?
Может кто подскажет как это сделать?
Слава.
P.S.
Конечно же простое решение:
Прямо указать нужные даты, потому что их не так уж и много - действует. Но хочется еще и изящества. 
-
SlavaZoid
-
- Posts: 1
- Joined: Wed, 13 Jul 2005, 12:19
by VK » Wed, 13 Jul 2005, 13:15
А в крон-формате такого и нет. Тут нужно сначала формализовать логику: как отличить последний рабочий день месяца от остальных. Изучи вот эту главу в доках: http://www.nncron.ru/help/RU/commands/date_time.htm Там описаны слова, которые могут пригодиться. Скажем, MonLength, Day@, WDay@ и т. д.
CU
VK
-

VK
-
- Posts: 680
- Joined: Wed, 14 Jul 2004, 19:17
-
by MuR » Sat, 30 Oct 2010, 13:57
Сам искал — не нашёл, но нашёл эту страницу  После того как минут 15 посидел, почитал мануалы - решил запостить решение. - Code: Select all
#( CLASSIC-TASK-#-RUN-EVERY-LAST-WORKDAY Time: 0 8 * * 1-5 Rule: Year@ Mon@ MonLength Day@ 7 + < Action: MSG: "Сегодня последний рабочий день месяца!" #)
-
MuR
-
- Posts: 27
- Joined: Thu, 10 Nov 2005, 08:58
by AlikasS » Fri, 12 Nov 2010, 04:17
MuR wrote:Сам искал — не нашёл, но нашёл эту страницу  После того как минут 15 посидел, почитал мануалы - решил запостить решение. - Code: Select all
#( CLASSIC-TASK-#-RUN-EVERY-LAST-WORKDAY Time: 0 8 * * 1-5 Rule: Year@ Mon@ MonLength Day@ 7 + < Action: MSG: "Сегодня последний рабочий день месяца!" #)
в ноябре сработает 24,25,26,29,30 числа 
-

AlikasS
-
- Posts: 1453
- Joined: Wed, 28 Jun 2006, 05:39
- Location: Khabarovsk
by elos » Fri, 12 Nov 2010, 14:23
Оттолкнёмся от такой таблички (вспоминая, что в месяце может быть 28/29/30/31 дней) и обозначив последний день месяца как LDM@: - Code: Select all
-------------------+---------------------------- 01 02 03 04 05 | 06 07 | дни недели -------------------+--------+------------------- 25 26 27 28 29 | 30 31 | LDM@ Day@ - 2- 0= +------------------- 26 27 28 29 30 | 31 | LDM@ Day@ - 1- 0= ----------------------------+------------------- 27 28 29 30 31 | | 28 29 30 31 | | 29 30 31 | | LDM@ Day@ = 30 31 | | 31 | | -------------------+----------------------------
Дальше имеем: - Code: Select all
#( CALCULATION_LAST_WORKDAY_OF_MONTH Time: 0 8 * * 1-5
: LastDayMonth Year@ Mon@ MonLength ; : LDM@ LastDayMonth ;
Action:
LDM@ Day@ - >R \ или, убрав слова до action, просто написать Year@ Mon@ MonLength Day@ - >R R@ 2- 0= \ flag1 R@ 1- 0= \ flag2 R> 0= \ flag3 OR OR IF MSG: "Сегодня последний рабочий день месяца!" ELSE MSG: "Продолжаем работать!" THEN
)#
По идее, должно работать...
"Везение" - это результат тщательной подготовки, "невезение" - следствие разболтанности и лени. - Роберт Хайнлайн Хорошо сформулированный вопрос отпадает сам собой.
-
elos
-
- Posts: 673
- Joined: Tue, 25 Apr 2006, 11:15
-
by AlikasS » Sat, 13 Nov 2010, 10:04
elos wrote:Оттолкнёмся от такой таблички (вспоминая, что в месяце может быть 28/29/30/31 дней) и обозначив последний день месяца как LDM@: - Code: Select all
-------------------+---------------------------- 01 02 03 04 05 | 06 07 | дни недели -------------------+--------+------------------- 25 26 27 28 29 | 30 31 | LDM@ Day@ - 2- 0= +------------------- 26 27 28 29 30 | 31 | LDM@ Day@ - 1- 0= ----------------------------+------------------- 27 28 29 30 31 | | 28 29 30 31 | | 29 30 31 | | LDM@ Day@ = 30 31 | | 31 | | -------------------+----------------------------
Дальше имеем: - Code: Select all
#( CALCULATION_LAST_WORKDAY_OF_MONTH Time: 0 8 * * 1-5
: LastDayMonth Year@ Mon@ MonLength ; : LDM@ LastDayMonth ;
Action:
LDM@ Day@ - >R \ или, убрав слова до action, просто написать Year@ Mon@ MonLength Day@ - >R R@ 2- 0= \ flag1 R@ 1- 0= \ flag2 R> 0= \ flag3 OR OR IF MSG: "Сегодня последний рабочий день месяца!" ELSE MSG: "Продолжаем работать!" THEN
)#
По идее, должно работать...
не работает. - Code: Select all
: LastDayMonth Year@ Mon@ MonLength ;
: LastWorkDayMonth { \ lwdm -- } Year@ Mon@ LastDayMonth DUP TO lwdm WEEK-DAY 5 > IF Year@ Mon@ LastDayMonth 1 - DUP TO lwdm WEEK-DAY 5 > IF Year@ Mon@ LastDayMonth 2 - TO lwdm THEN THEN lwdm ; : LWDM@ LastWorkDayMonth ;
слова LastWorkDayMonth или LWDM@ положат на стек последний рабочий день в текущем месяц. сравнить его с текущим днем и все дела
-

AlikasS
-
- Posts: 1453
- Joined: Wed, 28 Jun 2006, 05:39
- Location: Khabarovsk
by elos » Sat, 13 Nov 2010, 12:58
Каюсь, перемудрил, так как сам тоже поглядывал в сторону универсального решения. Стремился к краткости и изяществу и "намешал" всё в кучу... Исправляю свой "узконаправленный" на работу в последний рабочий день месяца в рабочие дни недели код : - Code: Select all
#( CALCULATION_LAST_WORKDAY_OF_MONTH Time: 0 8 * * 1-5 Action: Year@ Mon@ MonLength Day@ - 0= IF MSG: "Сегодня последний рабочий день месяца!" ELSE MSG: "Продолжаем работать!" THEN )# Проверил в автоматике на разных датах календаря - работает только 28/29/30/31 числа в рабочие дни недели (если руками не запускать, иначе можно нарваться на ошибочный вывод в выходные дни)
"Везение" - это результат тщательной подготовки, "невезение" - следствие разболтанности и лени. - Роберт Хайнлайн Хорошо сформулированный вопрос отпадает сам собой.
-
elos
-
- Posts: 673
- Joined: Tue, 25 Apr 2006, 11:15
-
by post2 » Tue, 16 Nov 2010, 20:38
- Code: Select all
#( CALCULATION_LAST_WORKDAY_OF_MONTH \ День недели будет проверяться внутри задачи Time: 0 8 * *
Action:
Year@ Mon@ MonLength Day@ - DUP 0= \ Последний день месяца Year@ Mon@ Day@ WEEK-DAY 6 < AND \ и приходится на будний день SWAP 3 < \ Либо разница длительности месяца и сегодняшнего дня меньше трех Year@ Mon@ Day@ WEEK-DAY 5 = AND \ и сегодня пятница OR IF MSG: "Сегодня последний рабочий день месяца!" ELSE MSG: "Продолжаем работать!" THEN
)#
-
post2
-
- Posts: 1
- Joined: Mon, 15 Nov 2010, 16:28
by AlikasS » Tue, 07 Dec 2010, 02:20
AlikasS wrote:- Code: Select all
: LastDayMonth Year@ Mon@ MonLength ;
: LastWorkDayMonth { \ lwdm -- } Year@ Mon@ LastDayMonth DUP TO lwdm WEEK-DAY 5 > IF Year@ Mon@ LastDayMonth 1 - DUP TO lwdm WEEK-DAY 5 > IF Year@ Mon@ LastDayMonth 2 - TO lwdm THEN THEN lwdm ; : LWDM@ LastWorkDayMonth ;
слова LastWorkDayMonth или LWDM@ положат на стек последний рабочий день в текущем месяц. сравнить его с текущим днем и все дела
ну и первый рабочий день месяца - Code: Select all
: FirstWorkDayMonth { \ fwdm -- } \ вывести первый рабочий день месяца Year@ Mon@ 1 DUP TO fwdm WEEK-DAY 5 > IF Year@ Mon@ 2 DUP TO fwdm WEEK-DAY 5 > IF 3 TO fwdm THEN THEN fwdm ;
т.е. в задаче можно проверять - Code: Select all
\ совпадение с первый рабочим днем месяца Rule: Day@ FirstWorkDayMonth =
или - Code: Select all
\ совпадение с последним рабочим днем месяца Rule: Day@ LastWorkDayMonth =
-

AlikasS
-
- Posts: 1453
- Joined: Wed, 28 Jun 2006, 05:39
- Location: Khabarovsk
by Elk » Thu, 09 Dec 2010, 16:06
Вот, мне кажется, достаточно изящное решение - Code: Select all
#( lastworkday Time: 0 8 * * 1-5 * Rule: Year@ Mon@ MonLength Day@ = WDay@ 5 = Year@ Mon@ MonLength 3 - Day@ < AND OR Action: MSG: "Сегодня последний рабочий день в этом месяце!" )#
Конечно, остаются еще праздничные дни, но это в задаче не ставилось.
-
Elk
-
- Posts: 13
- Joined: Sat, 02 Dec 2006, 11:07
-
by Elk » Fri, 10 Dec 2010, 09:09
Или вот еще, даже более оптимально ИМХО - Code: Select all
#( lastworkday Time: 0 8 * * 1-5 * RunMissed Rule: Year@ Mon@ MonLength DUP Day@ = SWAP 3 - Day@ < WDay@ 5 = AND OR Action: MSG: "Сегодня последний рабочий день в этом месяце!" )#
-
Elk
-
- Posts: 13
- Joined: Sat, 02 Dec 2006, 11:07
-
by AlikasS » Fri, 10 Dec 2010, 09:45
надо SlavaZoidа раскопать и сказать что, на его вопрос куча ответов появилось 
-

AlikasS
-
- Posts: 1453
- Joined: Wed, 28 Jun 2006, 05:39
- Location: Khabarovsk
Return to nnCron forum (Russian)
Who is online
Users browsing this forum: No registered users and 4 guests
|
|