Author Topic: Скриптом вычислить послденее воскресенье октября?  (Read 7935 times)

0 Members and 1 Guest are viewing this topic.

Offline Xray_Linux_Root

  • Sr. Member
  • ****
  • Posts: 296
  • Karma: +2/-0
Кто подскажет способ вычисления последнего воскресенья октября месяца скриптом?
По идее должен быть способ проще, чем резать вывод команды cal.
Mandrake, ASPLinux, Slackware, RedHat, Fedora, Debian
Зачем M$ Exchange? Есть eGroupware!
-j MASQUERADE + друзья в других сетях помогут построить мир независимо от желания вашего провайдера ;)

Offline never hood

  • Hero Member
  • *****
  • Posts: 845
  • Karma: +16/-10
  • www.4job.co
    • Работа, которую ты искал
Quote from: Xray_Linux_Root
Кто подскажет способ вычисления последнего воскресенья октября месяца скриптом?
По идее должен быть способ проще, чем резать вывод команды cal.
perldoc Date::Manip

Offline Xray_Linux_Root

  • Sr. Member
  • ****
  • Posts: 296
  • Karma: +2/-0
Спасибо!

Всё время сказать забываю, что лучше bash и бианрники на Си

Мой вариант:
Code: [Select]
#!/bin/sh
LC_ALL=C

DATE_REQ=`date -d "last sunday this month" +%d-%m`
DATE_NOW=`date +%d-%m`
if [ "$DATE_REQ" == "$DATE_NOW" ]; then
    echo test
fi

Можно конечно и -%m выкинуть.
« Last Edit: October 29, 2007, 12:24:18 by Xray_Linux_Root »
Mandrake, ASPLinux, Slackware, RedHat, Fedora, Debian
Зачем M$ Exchange? Есть eGroupware!
-j MASQUERADE + друзья в других сетях помогут построить мир независимо от желания вашего провайдера ;)

Offline never hood

  • Hero Member
  • *****
  • Posts: 845
  • Karma: +16/-10
  • www.4job.co
    • Работа, которую ты искал
Поведал бы, зачем это нужно?
Уж сколько лет за консолью, а задачи такой не стояло...

Offline Xray_Linux_Root

  • Sr. Member
  • ****
  • Posts: 296
  • Karma: +2/-0
Quote from: never hood
Поведал бы, зачем это нужно?
Уж сколько лет за консолью, а задачи такой не стояло...
Не вопрос как говорится
Юзается в одной, обслуживаемой мной конторе, FoxPro под ляликс, так вот два раза в год из-за перехода на зимнее время и обратно на летнее время встаёт проблема - смены часового пояса передаваемого в виде переменной FoxPro при его запуске.
Как решение было начато использование двух идентичных файлов tz.winter и tz.summer в которых естественно различается только одна строка устанавливающая эту переменную TZ. А вот этот скриптик нужен просто чтобы переставлять символическую ссылку с одного файла на другой.

Т.к. в perl я не в зуб ногой, bash как то роднее, то и состряпал на bash.

Теперь осталось повесить сей скрипт в cron чтобы выполнялся каждое воскресенье в марте и октябре месяце.
Mandrake, ASPLinux, Slackware, RedHat, Fedora, Debian
Зачем M$ Exchange? Есть eGroupware!
-j MASQUERADE + друзья в других сетях помогут построить мир независимо от желания вашего провайдера ;)

Offline Xray_Linux_Root

  • Sr. Member
  • ****
  • Posts: 296
  • Karma: +2/-0
Должен заметить, что на этом скрипте всё не закончилось....
Т.к. комбинация last sunday this month, как выснилось, выводит почему то дату воскресенья текущей недели
Mandrake, ASPLinux, Slackware, RedHat, Fedora, Debian
Зачем M$ Exchange? Есть eGroupware!
-j MASQUERADE + друзья в других сетях помогут построить мир независимо от желания вашего провайдера ;)

Offline nuclight

  • Full Member
  • ***
  • Posts: 207
  • Karma: +1/-2
    • http://antigreen.org
Мда, много курил info date, так нихрена и не удалось подобрать. То есть оно конечно выводит, но это пока дата еще не ушла далеко.

master:~# date --date="$(date +%Y-10-31) -1 week"
Срд Окт 24 01:00:00 NOVST 2007
master:~# date --date="$(date +%Y-10-31) last Sunday"
Срд Окт 31 00:00:00 NOVT 2007
master:~# date --date="last Sunday"
Вск Окт 28 00:00:00 NOVST 2007
master:~# date --date="last Thursday"
Чтв Окт 25 00:00:00 NOVST 2007
master:~# date --date="last Friday"
Птн Окт 26 00:00:00 NOVST 2007
master:~# date --date="last Monday"
Пнд Окт 29 00:00:00 NOVT 2007
master:~# date --date="2007-10-31 last Sunday"
Срд Окт 31 00:00:00 NOVT 2007

А вот во фре будет просто: date -v1d -v11m -v-1d -v-sun

Можно было бы конечно предложить в кроне указать диапазон для дней 25-31 и день недели, но он будет трактовать это не как AND, а как OR, т.е. выполнит в любой день. Впрочем, можно указать что-то одно из, и в скрипте уже указать дополнительное условие для текущего дня.
WBR, Nuclear Lightning
[FreeBSD][Давить зелёных]

Offline Xray_Linux_Root

  • Sr. Member
  • ****
  • Posts: 296
  • Karma: +2/-0
Нда... я и остановился на таком варианте, с дополнительным условием  

Code: [Select]
#!/bin/sh
LC_ALL=C

DATE_REQ=`date -d "last sunday this month" +%d`
DATE_NOW=`date +%d`

if [ "$DATE_REQ" -ge "25" ]; then
    if [ "$DATE_REQ" == "$DATE_NOW" ]; then
        echo test
    fi
fi
« Last Edit: November 01, 2007, 17:04:43 by Xray_Linux_Root »
Mandrake, ASPLinux, Slackware, RedHat, Fedora, Debian
Зачем M$ Exchange? Есть eGroupware!
-j MASQUERADE + друзья в других сетях помогут построить мир независимо от желания вашего провайдера ;)