Текущий номер недели

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

Текущий номер недели

Postby observer » Mon, 30 Nov 2009, 23:42

А как же все таки можно узнать текущий номер недели с начала года?
По роду деятельности, необходимо узнать номер недели, простую двузначную цифру. Перечитал мануал, прошелся поиском по форуму-результата к сожалению нет:( Вроде и задача то не сложна, но видно только мне это понадобилось.
observer
 
Posts: 6
Joined: Mon, 30 Nov 2009, 23:35

Re: Текущий номер недели

Postby Wyz » Tue, 01 Dec 2009, 04:17

Узнай номер дня недели 1 января (WEEK-DAY), добавь (текущий день года-1) (от текущей даты вычти 1 января DAYS, Days@), добавь 6 и дели на 7.
Wyz
 
Posts: 389
Joined: Tue, 11 Dec 2007, 01:42

Re: Текущий номер недели

Postby AlikasS » Tue, 01 Dec 2009, 05:43

еще надо учесть что если 1января года приходиться на пятницу-воскресенье (т.е. неделя 3 и меньше дней)
то эта неделя не считается первой (пример: в январе 2010 первая неделя: 4-10 числа )
Last edited by AlikasS on Wed, 02 Dec 2009, 10:20, edited 1 time in total.
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Текущий номер недели

Postby AlikasS » Wed, 02 Dec 2009, 10:09

Code: Select all
<%
: num-week { ye mo da \ pr1 pr2 -- } ( год месяц число -- номер_недели )
ye 01 01 WEEK-DAY
DUP 4 >
IF
0 TO pr1
ELSE
1 TO pr1
THEN
7 SWAP - TO pr2
ye mo da YMD>DATE ( DAYS )
ye 01 01 pr2 + 1 + YMD>DATE ( DAYS ) DATE-
DUP 0 <
IF
DROP pr1
ELSE
7 / 1 + pr1 +
THEN
;
%>
пользоваться так
Code: Select all
2010 02 13 num-week

или для текущей даты
Code: Select all
CUR-DATE DATE>YMD num-week

после этого на стеке номер недели.
P.S. по стандарту (не помню какому) в случае если 1января года приходиться на пятницу-воскресенье
то эта неделя не считается первой (пример: в январе 2010 первая неделя: 4-10 числа )
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Текущий номер недели

Postby observer » Wed, 02 Dec 2009, 10:38

AlikasS wrote:
Code: Select all
<%
: num-week { ye mo da \ pr1 pr2 -- } ( год месяц число -- номер_недели )
ye 01 01 WEEK-DAY
DUP 4 >
IF
0 TO pr1
ELSE
1 TO pr1
THEN
7 SWAP - TO pr2
ye mo da YMD>DATE ( DAYS )
ye 01 01 pr2 + 1 + YMD>DATE ( DAYS ) DATE-
DUP 0 <
IF
DROP pr1
ELSE
7 / 1 + pr1 +
THEN
;
%>
пользоваться так
Code: Select all
2010 02 13 num-week

или для текущей даты
Code: Select all
CUR-DATE DATE>YMD num-week

после этого на стеке номер недели.
P.S. по стандарту (не помню какому) в случае если 1января года приходиться на пятницу-воскресенье
то эта неделя не считается первой (пример: в январе 2010 первая неделя: 4-10 числа )


Большое спасибо. На данный момент озадачен другой проблемой, но вскоре вернусь и обязательно отпишусь как все прошло!!


Вот такой вопросик возник, прошу просто проверить. Задача:Отправить с определенной диры другую диру с названием= текущая дата на нужный фтп в определенное место с сохранение структуры диры, которую нужно отправить.

Code: Select all
asLoggedUser
Time: 0 5 * * * *
Action:
ShowNormal   NormalPriority
DIR-CREATE: "C:\dir\%DD%.%MM%.%YYYY%\dir1"
DIR-CREATE: "C:\dir\%DD%.%MM%.%YYYY%\dir2"
DIR-CREATE: "C:\dir\%DD%.%MM%.%YYYY%\dir3"

wput −−basename=%DD%.%MM%.%YYYY% C:\dir\%DD%.%MM%.%YYYY% ftp://pas:login@ftp_name/dir_name/
observer
 
Posts: 6
Joined: Mon, 30 Nov 2009, 23:35

Re: Текущий номер недели

Postby Morituruz » Sat, 09 Mar 2013, 23:54

Почему показывает разный номер недель для субботы и воскресенья?
Или только у меня?
Code: Select all
2013 3 9 num-week .
10  Ok
2013 3 10 num-week .
11  Ok
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Текущий номер недели

Postby AlikasS » Mon, 11 Mar 2013, 01:31

Moriturus wrote:Почему показывает разный номер недель для субботы и воскресенья?
Или только у меня?
Code: Select all
2013 3 9 num-week .
10  Ok
2013 3 10 num-week .
11  Ok

да. есть такое. сбивается после февраля. надо смотреть
P.S. интересно, перекликается ли с твоей темой Високосный год
добавлено: так и есть
Code: Select all
2012 3 1 DAYS . 2012 2 29 DAYS .
734990 734990  Ok
Last edited by AlikasS on Mon, 11 Mar 2013, 07:12, edited 1 time in total.
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Текущий номер недели

Postby AlikasS » Mon, 11 Mar 2013, 03:51

не помню от куда взял предыдущий алгоритм :(
новый алгоритм взят из
http://www.astronet.ru/db/msg/1182321/node7.html
получилось на коленке вот что
Code: Select all
0 VALUE ~mess 0 VALUE ~year  0 VALUE ~Day

: arr 14 ~mess - 12 / ;
: yrr ~year 4800 + arr - ;
: mrr ~mess 12 arr * + 3 - ;

: JD ~Day 153 mrr * 2 + 5 / +  365 yrr * + yrr 4 / + yrr 100 / - yrr 400 / + 32045 - ; \ количество юлианских дней
: d4 JD 31741 + JD 7 MOD - 146097 MOD  36524 MOD  1461 MOD  ;
: Lrr d4 1460 / ;
: d1 d4 Lrr - 365 MOD  Lrr + ;
: ~WN d1 7 /  1 + ;

: WN TO ~Day TO ~mess TO ~year  ~WN ;

узнавать номер недели так
Code: Select all
2013 3 9 WN .

упростить код прошу самому :)
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Текущий номер недели

Postby VoidVolker » Mon, 11 Mar 2013, 08:32

Переменные USER надо, а то при одновременном вызове из двух потоков будет непредсказуемый результат.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Текущий номер недели

Postby Morituruz » Mon, 11 Mar 2013, 08:39

а нельзя ли переопределить само бракованное слово DAYS? Оно в нескольких местах используется.
Он есть в исходниках:
Code: Select all
: DAYS ( y m d -- days)
\ Количество дней от начала летоисчисления по григорианскому календарю
    SWAP DUP 2 > IF 1+ ELSE 13 + ROT 1- ROT ROT THEN
    306 * 10 / + SWAP 36525 * 100 / +
;

: Days@ Year@ Mon@ Day@ DAYS ;
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Текущий номер недели

Postby elos » Mon, 11 Mar 2013, 15:37

Первой календарной неделей года считают первую неделю, содержащую первый четверг текущего года. В григорианском календаре -это неделя, содержащая 4 января.
По григорианскому календарю месяцы календарного года расположены в следующей последовательности, со своим специфическим именем и содержащие строго определенное число дней: январь - 31, февраль - 28 в обычный год и 29 - в високосныйгод, март - 31, апрель - 30, май - 31, июнь - 30, июль - 31, август - 31,сентябрь - 30, октябрь - 31, ноябрь - 30, декабрь - 31.
3.2.3 В григорианском календаре обычный год по продолжительности имеет 365 дней, високосный - 366 дней. Високосный год по количеству дней кратен 4. Вековые года являются високосными, если их номер кратен 400.

Стандарт ГОСТ ИСО 8601-2001 «СИБИД. Представление дат и времени. Общие требования», пункт 2.17.
Из Wikipedia:
год является високосным в двух случаях: либо он кратен 4, но при этом не кратен 100, либо кратен 400. Год не является високосным, если он не кратен 4, либо он кратен 100, но при этом не кратен 400.
Ещё раз и по другому:
Год високосный, если он делится на четыре без остатка, но если он делится на 100 без остатка, это не високосный год. Однако, если он делится без остатка на 400, это високосный год. Таким образом, 2000 г. является особым високосным годом, который бывает лишь раз в 400 лет.
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Текущий номер недели

Postby AlikasS » Mon, 11 Mar 2013, 16:46

elos wrote:
много всего из стандарта.

это к чему?
что смущает в решении viewtopic.php?f=5&t=10299#p32849 ?
кроме не USER переменных
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Текущий номер недели

Postby elos » Tue, 12 Mar 2013, 09:05

К чему?

Просто тема заинтересовала на будущее и поэтому привёл цитаты из стандарта и название стандарта (ваша ссылка у меня вчера "не отзывалась" упорно). Может понадобится в будущем.

Да просто привёл для поиска (себе, любимому, и другим, может, ассоциируется некое слово для поиска) хотя бы в своих сообщениях. Ибо найти что-то на форуме иногда невозможно без точного знания фразы, особенно глядя на тему "Вопрос-ответ", растянувшуюся уже на десяток страниц. Она, кстати, не нарушает ли правило "Один вопрос является названием темы"? Там есть некоторые вещи, мне интересные в какие-то моменты, которые найти можно только простым перебором постов. Закладки же дают возможность запомнить или всю тему, или прыгнуть в конец этой темы. Вот и вспоминай потом, что же меня заставило запомнить пост "Отсылка письма средствами nnCron" на 14 страниц...

Кстати, якобы моя цитата "много всего из стандарта." откуда взялась? На этой единственной пока странице темы она только в вашем сообщении. (Отчего я и наваял тут столько букв...)

P.S. Никого не хотел никоим образом задеть! А то в молодости вопрос задал без всякой задней мысли зампотеху по существу - тут же слетел с дежурства в наряд... И, не вдаваясь в детали, не верится, что DAYS вдруг стало "бракованным". Столько лет работало - и вдруг перестало... Я обычно на себя грешу, что не учёл мелочи, в глаза не бросающейся. Теперь вот буду разбираться где DAYS бракованное, ибо где-то уже употреблял и примерно с 2005 года у меня претензий не было к результатам работы моих скриптов...
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Текущий номер недели

Postby Morituruz » Tue, 12 Mar 2013, 11:41

elos wrote:И, не вдаваясь в детали, не верится, что DAYS вдруг стало "бракованным".

Хотите верьте, хотите нет, но в свежем билде этот брак/баг/фичу пофиксили:
Code: Select all
nnCron. v 1.93b12 Build 1156 12.03.2013
Copyright (C) 2000-2013 nnSoft. email:nemtsev@nncron.ru
Зарегистрирован только для некоммерческого использования
Registered for non-commercial use only
2012 3 1 DAYS . 2012 2 29 DAYS .
734561 734560  Ok

Хотя цифры совсем другие О.о?
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Текущий номер недели

Postby elos » Tue, 12 Mar 2013, 14:26

До кучи докину про день недели дабы не искать потом (взято из русской wiki про вечный календарь, по любому надо перепроверять).
В программировании существуют разнообразные методы вычисления дня недели. Некоторые из них основываются на заранее просчитанных таблицах сдвигов, а некоторые вычисляют все необходимые значения «с нуля» при каждом запуске. Иногда алгоритмы представляют собой автоматизированные версии табличных календарей.

Как правило, каждый метод имеет две модификации — для юлианского и для григорианского календаря.

Стандартный алгоритм

Январь — это 1, декабрь — 12 месяц. Для определения сдвига используется следующая формула: a=(14-месяц) div 12 (a — вспомогательная величина). Затем определяются год и месяц с учётом поправки: y=(год+1)-a. m=месяц+12·a-2.

После вспомогательных операций вычисляется сам день недели:
result=(7000+(день+y+y div 4-y div 100+y div 400+(31×m) div 12)) mod 7

Для юлианского календаря формула выглядит так:
result=(6998+(день+y+y div 4+(31×m) div 12)) mod 7

Результат — число от 0 до 6, где 0 — воскресенье, 1 — понедельник, 2 — вторник, 3 — среда, 4 — четверг, 5 — пятница, 6 — суббота.

Глядишь, и вычисление недели тут же...
How do I calculate the week number given a date?
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 2 guests

cron