Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Функция сравнения дат

Функция сравнения дат

Ответ
Поиск в этой теме
Непрочитано 13.01.2009, 10:02 #1
Функция сравнения дат
Holon
 
CNC
 
Israel
Регистрация: 07.07.2007
Сообщений: 302

К примеру всегда без проблем сравнивал даты в таком виде: (fix (getvar "cdate"))
против аргумента которы возвращал к примеру 20081201,
(setq test_dat 20081201)(if(>= test_dat (fix (getvar "cdate"))(.......)(.......))
но теперь задача стоит немного подругому, нужно к текущей дате прибавить автоматом
5 дней потом полученный результат можно сохранить в файле или
(vl-registry-write "HKEY_CURRENT_USER\\Blja-Blja" "" test_dat) неважно, и переодически сравнивать при запуске,
вначале я пошел по пути который оказался ошибочным
(setq test_dat (+ (fix (getvar "cdate")) 5))
а потом при тестировании заметил, что функция работает "неправильно" причина в том, что
разница в датах 20090201 и 20090112 скажем 19 дней а при вычитании 20090201-20090112=89,
я конечно могу разбить дату на месяцы, годы и дни
c (fix (getvar "cdate"))
y (/ c 10000) ; Get year
m (rem (/ c 100) 100) ; Ger month
d (rem c 100) ; Get day
а потом кучей условий все это хозяйство сравнивать, может есть более изящное решение,
наверняка кто-то сталкивался с такой задачей............
Просмотров: 3402
 
Непрочитано 13.01.2009, 10:30
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Я бы переводил дату, например, в часы (умножив на 24), потом добавлял 24*5=120 и сравнивал "часовые" варианты.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.01.2009, 10:32
#3
ытя


 
Регистрация: 23.09.2005
СПб
Сообщений: 425


Смотри функцию cvunit
ытя вне форума  
 
Автор темы   Непрочитано 13.01.2009, 11:14
#4
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я бы переводил дату, например, в часы (умножив на 24), потом добавлял 24*5=120 и сравнивал "часовые" варианты.
(20090201 * 24) -(20090112*24) = 482164824-482162688=2136
2136/24=89
Чего-то я непонял мне наверно в школу надо математику учить?
Все равно нужно делить на года месяцы и т.д., а потом года нужно умножить на 369 или сколько там дней в году, (а если год высокосный ?) а с месяцами что делать на 30 или 31 :-(

--> ытя ну и cvunit хорошая функция, но на мысли никакие ненаводит.........

Последний раз редактировалось Holon, 13.01.2009 в 11:30.
Holon вне форума  
 
Непрочитано 13.01.2009, 13:40
#5
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Вот свежеиспеченная функция для подсчета кол-ва дней от рождества христова:
Код:
[Выделить все]
(defun countdate (date / mes)
(setq
mes	 (if (= (rem (atoi (substr date 1 4)) 4) 0)
	'(0 31 60 91 121 152 182 213 244 274 305 335);весокосный год
	'(0 31 59 90 120 151 181 212 243 273 304 334))
data	(+ 	(* (atoi (substr date 1 4)) 365); дней в году
		(/ (1- (atoi (substr date 1 4))) 4); 29 февраля всех весокосных лет кроме текущего
		(nth (1- (atoi (substr date 5 2))) mes); дней с начала года до начала месяца
		(atoi (substr date 7)); число
	);end of +
);end of setq
);end of countdate
на входе строка формата "ггггммчч", получаеться, например, при помощи
Код:
[Выделить все]
(rtos (fix (getvar "cdate")))
.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 13.01.2009, 13:45
#6
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Да в одну строку неполучилось, вспомогательная функция
(day_by_month (номер месяца)) возвращает кол-во дней в месяце,
работает только на 2009 год, еще год впереди есть время подумать
и основная функция (count_day (дата))возвращает кол-во дней с начала
года, пример вызова

Код:
[Выделить все]
_$ (count_day 20091231)
365
_$
и вот может кому-то понадобится:

Код:
[Выделить все]
(DEFUN day_by_month (nmm / day_by_month)
    (IF (= (ATOI (SUBSTR (ITOA (FIX (GETVAR "cdate"))) 4 1)) 9)
        (PROGN (COND ((OR (= nmm 1)
                          (= nmm 3)
                          (= nmm 5)
                          (= nmm 7)
                          (= nmm 8)
                          (= nmm 10)
                          (= nmm 12)
                      )
                      (SETQ day_by_month 31)
                     )
                     ((OR (= nmm 4) (= nmm 6) (= nmm 9) (= nmm 11))
                      (SETQ day_by_month 30)
                     )
                     ((= nmm 2) (SETQ day_by_month 28))
                     (T (PRINC))
               ) ;_cond
               day_by_month
        ) ;_progn
        (ALERT "2009 Only")
    ) ;_if
) ;_day_by_month

;;; (count_day 20090718)
(DEFUN count_day (date / mn c y m d cnt sym)
    (SETQ c   date
          y   (/ c 10000)                         ; Get year 
          m   (REM (/ c 100) 100)                 ; Ger month 
          d   (REM c 100)                         ; Get day
          cnt 1
          sym d
    )
    (IF (= m 1)
        (SETQ sym d)
        (PROGN (WHILE (< cnt m)
                   (SETQ sym (+ (day_by_month cnt) sym)
                         cnt (1+ cnt)
                   )
               ) ;_while
        ) ;_progn
    ) ;_if
    sym
) ;_day_by_month

Последний раз редактировалось Holon, 14.01.2009 в 17:24.
Holon вне форума  
 
Автор темы   Непрочитано 13.01.2009, 13:50
#7
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Дима мне твоя больше нравится :-)
Holon вне форума  
 
Непрочитано 14.01.2009, 16:42
#8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Holon, Есть еще от ГУРУ Autodeska
http://usa.autodesk.com/adsk/servlet...112&id=2694093
Там по дню, месяцу и году можно вычислять какой это будет день недели и т.п.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 14.01.2009, 17:13
#9
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Класс считает прям как моя
Код:
[Выделить все]
_$ (DayOfYear 07 20 2009)
201
_$ (count_day 20090720)
201
_$
жаль раньше ненашел.
Holon вне форума  
 
Непрочитано 14.01.2009, 20:10
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Подтверждаю:
Код:
[Выделить все]
_$ (- (countdate "20090720") (countdate "20081231"))
201
_$
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 14.01.2009, 21:42
#11
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


Код:
[Выделить все]
(setq test_dat (+ (fix (getvar "date")) 5))
Vov.Ka вне форума  
 
Непрочитано 15.01.2009, 10:37
#12
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
Код:
[Выделить все]
(setq test_dat (+ (fix (getvar "date")) 5))
Будет неверно работать с 24 февраля, и с 26-27 числа других месяцев.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 15.01.2009, 11:16
#13
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Будет неверно работать с 24 февраля, и с 26-27 числа других месяцев.
из справки
Цитата:
Stores the current date and time. This value is represented as a Modified Julian Date (MJD), which is the Julian day number and decimal fraction of a day in the format :
<Julian day number>.<Decimal fraction of a day>
.......
You can compute differences in date and time by subtracting the numbers returned by DATE.
Vov.Ka вне форума  
 
Непрочитано 15.01.2009, 11:44
#14
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


неразглядел date->cdate
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 15.01.2009, 11:59
#15
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Да действительно по примеру дат из первого поста, я переводил дату на компе
и получил правильный рзультат 20 дней, краткость сестра таланта.

Код:
[Выделить все]
_$ (fix (getvar "date"))
2454864
_$ (fix (getvar "date"))
2454844
_$ (- 2454864 2454844)
20
_$
Holon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Функция сравнения дат

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DwgRuLispLib: Функция открытия диалога Open\Save As файла (файлов) Supermax Библиотека функций 20 14.03.2018 10:05
Нужна функция импорта блока из файла Krieger Программирование 20 18.01.2017 07:19
Функция Explode text (разрыв текста в отрезки) Victor81 AutoCAD 6 10.03.2011 14:23
структурированный список Holon Программирование 22 11.09.2007 14:09
Функция rem Владимир М Программирование 5 20.12.2005 17:13