SQL.RU
 client/server technologies
 
 Главная | Документация | Статьи | Книги | Форум | Опросы | Рассылка | Работа | Поиск | FAQ |

Добро пожаловать в форум, Guest  >>  Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик  Ответить
 Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
gbcfk(f)^
Member

Откуда:
Сообщений: 250
Приветствую

Нужно посчитать точное кол-во дней, прошедшее с 01 Января 1960 года.
Собственно, как лучше учитывать високосные годы? Да и с месяцами как-то не очень понятно, неужели для каждого месяца учитывать свое кол-во дней..
27 окт 08, 03:45    [6357886] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
untitled
Member

Откуда:
Сообщений: 143
в эпичном треде про с++ решали такую задачу на всяких разных языках в качестве демонстрации их кошерности, можно там посмотреть)
27 окт 08, 04:29    [6357893] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
gbcfk(f)^
Member

Откуда:
Сообщений: 250
Ок, а "эпичный тред про С++" это где?
27 окт 08, 04:47    [6357898] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
untitled
Member

Откуда:
Сообщений: 143
тут
27 окт 08, 04:59    [6357900] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
gbcfk(f)^
Member

Откуда:
Сообщений: 250
Чего-то я так увлекся забавным срачем на первых страницах того топика, что не нашел в себе сил искать дальше :)
Да и без этого написал скрипт, все считает.. вот только одно но.
Имеется расхождение в несколько дней у моего результата и данными, которые я выдергиваю из AD vbs скриптом..
Кто-нибудь может независимо посчитать сколько дней прошло от 01/01/1601 до 01/01/2008?
У меня вышло 148657дней, контроллер домена упорно считает, что 148652
Кто прав? :)
В принципе, для моей задачи 5 дней туда-сюда не критичны, но все-таки где ошибка?
27 окт 08, 10:30    [6358336] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 237
gbcfk(f)^
сколько дней прошло от 01/01/1601 до 01/01/2008?
У меня вышло 148657дней, контроллер домена упорно считает, что 148652


За это время вообще-то сменился стиль календаря, причем в разных странах это происходило по-разному. В России, например, в 1918 году вообще 14 дней по...(теря)ли для революционной целесообразности. Контроллер домена в курсе, что такое революционная целесообразность?

Короче, ищите старожилов :-)
27 окт 08, 11:44    [6358803] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
gbcfk(f)^
Member

Откуда:
Сообщений: 250
Cane Cat Fisher
За это время вообще-то сменился стиль календаря, причем в разных странах это происходило по-разному. В России, например, в 1918 году вообще 14 дней по...(теря)ли для революционной целесообразности. Контроллер домена в курсе, что такое революционная целесообразность?

Короче, ищите старожилов :-)

(..лекторским голосом..)
Между прочим, эта дата (1 Января 1601 года... понедельник) является международным стандартом в некоторых областях, этакой точкой отсчета - началом начал (и вот не надо меня спрашивать, нафига так сделали)
Например, многие даты в AD считаются как число 100наносекундных интервалов, прошедших с 01/01/1601 до настоящего момента
27 окт 08, 13:19    [6359464] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
Frenzy
Member

Откуда: Донецк, Украина
Сообщений: 1137
надо юзать библиотечные функции. потому что задача сама по себе не простая. если почему-то надо изобрести велосипед, читаем умную книжку, например "Calendrical Calculations" (Dershowitz, Reingold)

_______________________________________
2pro4U
27 окт 08, 13:25    [6359506] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
gbcfk(f)^
Member

Откуда:
Сообщений: 250
Frenzy
Да я понимаю, что изобрел велосипед...
Да и какие в данном случае библиотечные функции можно использовать в vbs?
Просто прошу, кому не сложно, проверить полученное число дней :)
27 окт 08, 13:36    [6359569] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
Ёш
Member

Откуда:
Сообщений: 1765
gbcfk(f)^
Просто прошу, кому не сложно, проверить полученное число дней :)

postgresql:
seb=> select '01.01.2008'::date - '01.01.1601'::date;
 ?column?
----------
   148653
(1 запись)
mysql:
mysql> select datediff(cast('2008-01-01' as date), cast('1601-01-01' as date));
+------------------------------------------------------------------+
| datediff(cast('2008-01-01' as date), cast('1601-01-01' as date)) |
+------------------------------------------------------------------+
|                                                           148653 |
+------------------------------------------------------------------+
27 окт 08, 14:14    [6359882] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
Tamozhnya
Member

Откуда:
Сообщений: 32
Oracle 9ir2
Select to_date('01.01.2008', 'dd.mm.yyyy') - to_date('01.01.1601', 'dd.mm.yyyy') from dual
148653

VFP8.0
?{^2008-01-01}-{^1601-01-01}
148653
27 окт 08, 14:29    [6360019] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
gbcfk(f)^
Member

Откуда:
Сообщений: 250
Ёш
Tamozhnya
Вы сговорились?
Шучу :)
Значит 148653.. То, что я где-то ошибся это вполне возможно..
Странно, что с AD на 1 день разница вышла.. будем думать

Спасибо за отклик
27 окт 08, 15:06    [6360329] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
Rivmer
Member

Откуда:
Сообщений: 96
В AD скорее всего считают по формуле наподобие
365N + Floor(N/4) + L,
где N количество полных лет, а L - количество дней неполного года.
27 окт 08, 19:20    [6362269] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
Worobjoff
Member

Откуда:
Сообщений: 2145
DateTime.Now.Subtract(new DateTime(1960, 1, 1)).Days
28 окт 08, 13:28    [6365028] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
gbcfk(f)^
Member

Откуда:
Сообщений: 250
Всё это конечно замечательно... НО
Теорема (о кол-ве дней):
С 01.01.1601 по 31.12.2007 включительно прошло РОВНО 148656 дней. Это доказывает скрупулезное вычисление карандашиком на бумажке
ДОКАЗАТЕЛЬСТВО:
1) полных лет прошло: 2007-1601+1=407
2) из них високосных было 101 штука
3) значит невисокосных было 306 штук
Итого: кол-во дней = 306*365 + 101*366 = 148656

Ну никак 148653 не выходит
30 окт 08, 06:44    [6373838] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
Ёш
Member

Откуда:
Сообщений: 1765
gbcfk(f)^

2) из них високосных было 101 штука
если вы считаете чисто математически, високосных было 98:
автор
Иными словами, год является високосным, если он кратен 4 и при этом не кратен 100, либо кратен 400.

seb@seb:~$ perl -e '$c = 0; for (1601..2007){ $c += 1 if ($_ % 4 == 0 && $_ % 100 != 0) || ($_ % 400 == 0); }; print "$c\n";'
98
но это всё равно не точно. посмотрите внимательно комментарий Cane Cat Fisher.

автор
Даты перехода стран на григорианский календарь 1582 — Италия, Испания, Португалия, Польша, Франция, Лотарингия, Голландия, Люксембург, Великое княжество Литовское. 1583 — Австрия (часть), Бавария, Тироль. 1584 — Австрия (часть), Швейцария, Силезия, Вестфалия. 1587 — Венгрия. 1610 — Пруссия. 1700 — протестантские немецкие государства, Дания (включая Норвегию). 1752 — Великобритания и колонии. 1753 — Швеция (включая Финляндию). 1873 — Япония. 1911 — Китай. 1912 — Албания. 1916 — Болгария. 1918 — Советская Россия. 1919 — Сербия, Румыния. 1924 — Греция. 1927 — Турция. 1928 — Египет.
Вы для какой страны считаете ? :)

автор
1610 — Пруссия. 1700 — протестантские немецкие государства, Дания (включая Норвегию). 1752 — Великобритания и колонии. 1753 — Швеция (включая Финляндию). 1873 — Япония. 1911 — Китай. 1912 — Албания. 1916 — Болгария. 1918 — Советская Россия. 1919 — Сербия, Румыния. 1924 — Греция. 1927 — Турция. 1928 — Египет.
в этих странах переход на григорианский календарь попадает в Ваш промежуток и по хорошему как минимум для них нужно вычитать ещё эндцать дней, так как их реально небыло, календарь был сдвинут на эндцать дней вперёд :)

ps: но БД как ни странно кладут на реальное количество дней и такую коррекцию не делают %)
30 окт 08, 09:44    [6374205] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
gbcfk(f)^
Member

Откуда:
Сообщений: 250
В данном случае, АД считает високосными годаме все года начиная с 1600 кратные четырем. И их было с 1601-го ровно 101.
Ну и, само собой, никакие смены календарей не учитываются :)
30 окт 08, 10:21    [6374470] Ответить | Цитировать    Сообщить модератору

 Re: Подскажите с алгоритмом: посчитать кол-во дней с определенной датой   [new]
gbcfk(f)^
Member

Откуда:
Сообщений: 250
Стоп! А ведь действительно, если года, кратные 4 и 100, но не кратные 400 не являются високосными, то итоговое кол-во дней по моим подсчетам = 148653
Итого имеем расхождение с АД на 1 день
Ёш
Благодарю, кто бы мог подумать, что 1700, 1800 и 1900 года не високосные
30 окт 08, 10:29    [6374526] Ответить | Цитировать    Сообщить модератору

Все форумы / Программирование Ответить
Generated time: 93ms.
Rambler's Top100 Powered by ActualForum 1.5.3 [s1] Copyright (c) Alex Sibilev 2000-2010