![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Нужно сравнивать две даты в формате дд/мм/гггг и определить, какая дата больше.
День и месяц может быть записан с нулем или без нуля: 01/01/2013 или 1/1/2013. Как это проще всего сделать? Добавлено через 8 минут и 30 секунд Без модулей. |
|||
|
||||
reiserford |
|
|||
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 22 Регистрация: 20.3.2012 Репутация: 1 Всего: 1 |
разбей каждую до DD, MM, YYYY
каждой сделай sprintf('%04d-%02d-%02d', YYYY, MM, DD) и сравни результаты sprintf |
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: нет Всего: 133 |
Формат похож на используемый в Англии и для британских Windows подойдет обычный StrToDate. Но для не британский будет выдавать ошибку. Так что нужно силой указать сепаратор (в русских Windows это точка).
Ну а TDate - это обычный Double и сравнивается операторами сравнения. Добавлено через 4 минуты и 35 секунд Ой, сори ребята, разделом уж сильно ошибся ![]() Это сообщение отредактировал(а) Poseidon - 10.4.2013, 10:55 -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Ребята, как думаете, а такой вариант сработает?
То есть я просто получаю количество дней, умножая год на 356, месяц - на 30 и прибавляя дни. А потом просто сравниваю количество дней в двух датах. |
|||
|
||||
Jimy |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 4.7.2010 Репутация: нет Всего: 3 |
Не сработает. 31 января и 1 февраля дадут одинаковое значение.
|
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Только эти два дня?
Добавлено через 1 минуту и 34 секунды Да, посчитал - в каждом месяце такая фигня выходит... |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
формула вычисления високосных годов известна -- написать функцию не проблема подсчета дней не проблема, imho.
|
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
В общем, определяю так:
а потом сравниваю оператором gt. |
|||
|
||||
krypt3r |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 9.6.2009 Репутация: 2 Всего: 16 |
1. Заюзать Delta_Days из Date::Calc
2. Перевести даты в Unixtime или Julian Day и сравнивать |
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
POSIX::mktime
|
|||
|
||||
DProf |
|
||||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 28.9.2012 Репутация: 1 Всего: 1 |
Сравнивать строки - плохо. Чего Вам функция вычисления вычисления юлианского дня не понравилась? Если что, то это количество дней (дробное), прошедшее с 4713 года до нэ. Это уникальное значение. В *NIX время практически так же хранится.
Самому функцию писать не надо даже, если не хотите. Юзайте так:
Сравнить то есть так:
Читать http://perldoc.perl.org/5.10.1/perlfaq4.ht...e-Julian-Day%3f http://search.cpan.org/~muir/Time-modules-...me/JulianDay.pm Но поскольку Вы модулей использовать не хотите - то пишите julian_day() сами по аналогу с функцией на С что я скинул Это сообщение отредактировал(а) DProf - 11.4.2013, 16:25 |
||||
|
|||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Понятно, спасибо.
Дело не в том, что "не хочу использовать модули". Просто у пользователей - целый зоопарк из разных версий Perl. Нужного модуля может и не быть, а почти никто не умеет их специально устанавливать. Поэтому приходится писать так, чтобы скрипт работал на любой сборке Perl 5.8 или выше. |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
# corelist -a Time::Local | grep -v undef | head -7
Data for 2013-03-21 Time::Local was first released with perl 5 v5.7.3 1.04 v5.8.0 1.04 v5.8.1 1.07 v5.8.2 1.07 # corelist -a POSIX | grep -v undef | head -7 Data for 2013-03-21 POSIX was first released with perl 5 5.002 1.00 5.00307 1.00 5.004 1.02 5.00405 1.02 # |
|||
|
||||
Pilat66 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 27.1.2009 Репутация: 1 Всего: 1 |
В первом ответе есть совет, может быть без юлианских календарей и високосных секунд будет проще? #!perl use strict; sub normalize { warn $_[0]; my $t = sprintf('%04d-%02d-%02d', reverse(split '/', $_[0])); warn $t; return $t; } my $date1 = '01/01/2012'; my $date2 = '2/2/2012'; print "date1 < date2" if normalize($date1) lt normalize($date2); |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |