как получить вчерашнюю дату в формате YYYYMMDD?

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

как получить вчерашнюю дату в формате YYYYMMDD?

Postby ru3002 » Wed, 25 Jul 2007, 13:06

как получить вчерашнюю дату в формате YYYYMMDD? Надо создавать каталог в таком формате. И копировать в него файлы.
Максимум что у меня получилось:
MSG: "%CUR-DATE DATE>YMD -1 DAY+ YMD>DATE DATE>S%"
выдает дату в формате DD-MM-YYYY.
ru3002
 
Posts: 7
Joined: Wed, 25 Jul 2007, 12:58
Location: Челябинск, Россия

Postby Kostya5 » Wed, 25 Jul 2007, 13:57

Code: Select all
CREATE w_Date 256 ALLOT
VARIABLE w_Day
VARIABLE w_Month
VARIABLE w_Year

Action:

    Year@ Mon@ Day@
    -1 DAY+

    \ присваиваем значение
    w_Day !
    w_Month !
    w_Year !

    \ формируем строку с датой
    w_Year  @ N>S           w_Date  PLACE
    w_Month @ S>D <# # # #> w_Date +PLACE
    w_Day   @ S>D <# # # #> w_Date +PLACE

\ копируем файлы
Kostya5
 
Posts: 19
Joined: Wed, 25 Jul 2007, 13:50

Postby VoidVolker » Wed, 25 Jul 2007, 15:14

Проще определить новое слово:
Code: Select all
: Вчера  ( -- вчерашняя_дата_YYYYMMDD )
  CUR-DATE DATE>YMD -1 DAY+
  >R >R N>S  R>
  S>D <# # # #> S+ 
  R> S>D <# # # #> S+ ;
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Postby ru3002 » Thu, 26 Jul 2007, 08:00

VoidVolker wrote:
Code: Select all
: Вчера  ( -- вчерашняя_дата_YYYYMMDD )
  CUR-DATE DATE>YMD -1 DAY+
  >R >R N>S  R>
  S>D <# # # #> S+ 
  R> S>D <# # # #> S+ ;


Круто, это сработало. Правда для меня осталось загадкой как это работает. Например не понятно зачем выборка значения из стека данных делается два раза " >R " .
Не нашел что делает " <# # # #> " и т.д.
Ну в общем спасибо. Хотя понимаю спасибо не булькает. :wink:
ru3002
 
Posts: 7
Joined: Wed, 25 Jul 2007, 12:58
Location: Челябинск, Россия

Postby VoidVolker » Thu, 26 Jul 2007, 18:03

Code: Select all
для меня осталось загадкой как это работает. Например не понятно зачем выборка значения из стека данных делается два раза " >R "

Это не выборка значения из стека данных, а:
Слово >R перемещает число со стека данных на вершину стека возвратов.
Стек возвратов часто используется как временный буфер для временных значений, но использовать его нужно аккуратно. А вообще вот так это работает:

CUR-DATE \ На стеке текущая дата в формате DATE
DATE>YMD \ Конвертируем ее в формат YMD
-1 DAY+ \ Отнимаем от даты один день, на стеке теперь три числа: Y M D
>R >R \ Перемещаем день и месяц на стек возвратов
N>S \ Конвертируем оставшееся число(год) в строку
R> \ Возвращаем со стека возвратов месяц
S>D \ Преобразуем месяц в число двойной длины(8 байт), а точнее просто помещаем на стек ноль, т.к. нижеследующие слов берут два числа со стека(по 4 байта каждое)
<# # # #> \ слова <# и #> обозначают начало и конец форматирования;
\ слово # пpеобpазует одну цифpу в заданной системе счисления;
\ слово #S - сpазу всё число;
\ слово SIGN вставляет знак "-" в выходную строку в том случае, если третье число в стеке отрицательное;
\ слово HOLD вставляет в текущую позицию любой символ, значение которого (в коде ASCII) находится в стеке. (подробности в хелпе-Неотложная помощь-7.Как пpеобpазовать число в стpоку и наобоpот?)
S+ \ Прибавляем полученную строку "месяц" к строке "год"
R> \ Возвращаем со стека возвратов день
S>D <# # # #> S+ \ Преобразуем в строку и прибавляем к предыдущей строке
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Postby ru3002 » Fri, 27 Jul 2007, 08:45

VoidVolker wrote: А вообще вот так это работает:


Спасибо за пояснения. "Я знаю что я ничего не знаю". Буду изучать дальше...
ru3002
 
Posts: 7
Joined: Wed, 25 Jul 2007, 12:58
Location: Челябинск, Россия

Postby ru3002 » Tue, 31 Jul 2007, 13:52

Нашел вообще изящное решение
Code: Select all
MSG: "%YYYY%%MM%%Day@ 1 -%"
ru3002
 
Posts: 7
Joined: Wed, 25 Jul 2007, 12:58
Location: Челябинск, Россия

Postby Dr.MoPo3ilo » Tue, 31 Jul 2007, 17:36

ru3002 wrote:Нашел вообще изящное решение
Code: Select all
MSG: "%YYYY%%MM%%Day@ 1 -%"

:-) а завтра (01.08.2007) тваое сообщение будет выглядеть как: 2007080
Это не решение.
User avatar
Dr.MoPo3ilo
 
Posts: 20
Joined: Wed, 18 Jul 2007, 00:20

Postby ru3002 » Wed, 01 Aug 2007, 15:41

Kostya5 wrote:
Code: Select all
CREATE w_Date 256 ALLOT
VARIABLE w_Day
VARIABLE w_Month
VARIABLE w_Year

Action:

    Year@ Mon@ Day@
    -1 DAY+

    \ присваиваем значение
    w_Day !
    w_Month !
    w_Year !

    \ формируем строку с датой
    w_Year  @ N>S           w_Date  PLACE
    w_Month @ S>D <# # # #> w_Date +PLACE
    w_Day   @ S>D <# # # #> w_Date +PLACE

\ копируем файлы

%w_Date% возвращает значение в формате YMD
ru3002
 
Posts: 7
Joined: Wed, 25 Jul 2007, 12:58
Location: Челябинск, Россия

Postby ru3002 » Wed, 01 Aug 2007, 16:25

объясните почему
Code: Select all
 консоль
: TEST1 2002 12 31 -1 DAY+ . . . ; CR
TEST1 CR

задача
: TEST1 2002 12 31 -1 DAY+ . . . ;
Action:
MSG: "    %TEST1% "

в консоли прокатывает, а в задаче нет. И в консоли в коде
Code: Select all
2002 12 31 -1 DAY+
не надо преобразовывать в формат YMD, а в задаче надо?
ru3002
 
Posts: 7
Joined: Wed, 25 Jul 2007, 12:58
Location: Челябинск, Россия

Postby VoidVolker » Wed, 01 Aug 2007, 23:14

RTFM!
Слово
Code: Select all
: TEST1 2002 12 31 -1 DAY+ . . . ;

печатает в консоли 30 12 2002
Соответственно таск:
Code: Select all
TEST1 2002 12 31 -1 DAY+ . . . ;
Action:
MSG: "    %TEST1% "

Напечатает в консоли 30 12 2002 и выдаст сообщение " " (пять пробелов)
Все. Тема закрыта! Ибо надоело уже одно и тоже третью неделю размусоливать.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Postby ru3002 » Thu, 02 Aug 2007, 06:12

Я конечно прошу прощения, но этот код в 2 августа выдал 20080801
Code: Select all
: Вчера  ( -- вчерашняя_дата_YYYYMMDD )
  CUR-DATE DATE>YMD -1 DAY+
  >R >R N>S  R>
  S>D <# # # #> S+ 
  R> S>D <# # # #> S+ ;


Ибо надоело уже одно и тоже третью неделю размусоливать.
И мне просто больше не у кого все это узнать. Сорри.
ru3002
 
Posts: 7
Joined: Wed, 25 Jul 2007, 12:58
Location: Челябинск, Россия

Postby VoidVolker » Thu, 02 Aug 2007, 10:58

Хмм.. А вот это уже очень странно... Почему-то после стековых манипуляций меняется содержание строки... У кого-нибудь еще наблюдается подобное?
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Postby Ilya » Thu, 02 Aug 2007, 14:48

Следующее вроде работает:
Code: Select all
#( Вчера
NoActive
CREATE buf1 256 ALLOT
Action:
\ Вчера  ( -- вчерашняя_дата_YYYYMMDD )
  CUR-DATE DATE>YMD -1 DAY+
  ROT S>D <# # # # # #> buf1 ZPLACE
  SWAP S>D <# # # #> buf1 +ZPLACE
  S>D <# # # #> buf1 +ZPLACE buf1 ASCIIZ> MsgBox
 
)# 
Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Postby VoidVolker » Fri, 03 Aug 2007, 00:02

Угу, через буфер работает, а вот после стековых манипуляций и перевода чисел в строки - просто полтергейтс какой-то, второй S>D <# # # #> вместо 03 выдает 08, месяц... так, глянул щас адреса выдаваемые <# # # #> Ага! Вот оно что - адреса-то одинаковые! А значит надо использовать буфер. Так, а вообще это глупое решение - ибо математика решает это все куда элегантенее:
Code: Select all
: Вчера  ( -- num_YYYYMMDD )
  Year@ Mon@ Day@ -1 DAY+  SWAP 100 * +  SWAP 10000 * + ;

А если нужна строка - то так это так:
Code: Select all
Вчера N>S

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

Next

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 2 guests