Сдвиг даты в прошлое

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Сдвиг даты в прошлое

Сообщение kreator »

Admin писал(а): 21 Ноябрь 2017, 14:08 Ну исправить недолго если нужно.
Нужно. Важное замечание!
Мой вариант (с учётом поправки ДП):

Код: Выделить всё

DateAdd              PROCEDURE  (Date LOC:Date, Long LOC:ValueAdd, Byte LOC:Type)

LOC:Day              BYTE
LOC:Month            SHORT
LOC:Year             SHORT

  CODE

 if ~LOC:ValueAdd or not inrange(LOC:Type, 1, 3)
   return(LOC:Date)
 end
 case LOC:Type
   of 1                                                                                        ! День
         return (LOC:Date + LOC:ValueAdd)   
   of 2                                                                                        ! Месяц 
         LOC:Day = day(LOC:Date)
         if LOC:ValueAdd<0
           LOC:Year = year(LOC:Date) 
           LOC:Month = month(LOC:Date) + LOC:ValueAdd
           if LOC:Month<=0 
             LOC:Year -= (int(abs(LOC:Month) / 12) + 1)
             LOC:Month = 12 - abs(LOC:Month) % 12 
             if LOC:Month=0
               LOC:Month = 12
             end  
           end  
           LOC:Date = date(LOC:Month, LOC:Day, LOC:Year)
         else
           LOC:Date = date(month(LOC:Date) + LOC:ValueAdd, LOC:Day, year(LOC:Date))
         end
         if day(LOC:Date)<LOC:Day
           return date(month(LOC:Date), 1, year(LOC:Date)) - 1
         else
           return LOC:Date
         end  
   of 3                                                                                        ! Год
         if month(LOC:Date)=2
           LOC:Day = day(LOC:Date)
           LOC:Date = date(month(LOC:Date), day(LOC:Date), year(LOC:Date) + LOC:ValueAdd)
           if day(LOC:Date)<LOC:Day
             return date(month(LOC:Date), 1, year(LOC:Date)) - 1
           else
             return LOC:Date
           end  
         else
           return date(month(LOC:Date), day(LOC:Date), year(LOC:Date) + LOC:ValueAdd)
         end  
 end
Оставил себе возможность добавить ещё и учёт времени (сейчас недосуг). Не хватает в Кларионе функций работы с датами и временем. Сейчас у нас много задач учёта разницы по времени (в разные сутки). Пишу на серваке в Firebird'е, благо всё равно писать запрос, а там все нужные функции в наличии. Но вот в кларионе тоже неплохо бы это поиметь. А заодно и тип данных DateTime (по-научному TimeStamp).
We are hard at work… for you. :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Сдвиг даты в прошлое

Сообщение Дед Пахом »

Ну кому надо позарез, могут юзать портированные нетовские классы DateTime и TimeSpan: http://www.ingasoftplus.com/edn_doc/index.html
С уважением, ДП
Ответить