Последний рабочий день месяца?

Обсуждение программ nnCron и nnCron LITE

Последний рабочий день месяца?

Postby SlavaZoid » Wed, 13 Jul 2005, 13:02

Привет, All!

Среди внушительного описания Cron-формата не нашел как указать в качестве момента времени запуска задачи "последний рабочий день месяца"?

Может кто подскажет как это сделать?

Слава.

P.S.
Конечно же простое решение:
Прямо указать нужные даты, потому что их не так уж и много - действует. Но хочется еще и изящества. :-)
SlavaZoid
 
Posts: 1
Joined: Wed, 13 Jul 2005, 12:19

Postby VK » Wed, 13 Jul 2005, 13:15

А в крон-формате такого и нет. Тут нужно сначала формализовать логику: как отличить последний рабочий день месяца от остальных. Изучи вот эту главу в доках: http://www.nncron.ru/help/RU/commands/date_time.htm Там описаны слова, которые могут пригодиться. Скажем, MonLength, Day@, WDay@ и т. д.
CU
VK
User avatar
VK
 
Posts: 680
Joined: Wed, 14 Jul 2004, 19:17

Re: Последний рабочий день месяца?

Postby 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

Re: Последний рабочий день месяца?

Postby 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 числа :-D
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Последний рабочий день месяца?

Postby 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: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Последний рабочий день месяца?

Postby 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@
положат на стек последний рабочий день в текущем месяц.
сравнить его с текущим днем и все дела
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Последний рабочий день месяца?

Postby 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: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Последний рабочий день месяца?

Postby 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

Re: Последний рабочий день месяца?

Postby 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 =
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Последний рабочий день месяца?

Postby Elk » Thu, 09 Dec 2010, 16:06

Вот, мне кажется, достаточно изящное решение :oops:
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

Re: Последний рабочий день месяца?

Postby 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

Re: Последний рабочий день месяца?

Postby AlikasS » Fri, 10 Dec 2010, 09:45

надо SlavaZoidа раскопать
и сказать что, на его вопрос куча ответов появилось :-D
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Yahoo [Bot] and 3 guests

cron