Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнивать две даты в формате дд/мм/гггг 
:(
    Опции темы
Suppir
Дата 10.4.2013, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Нужно сравнивать две даты в формате дд/мм/гггг и определить, какая дата больше.
День и месяц может быть записан с нулем или без нуля:  01/01/2013 или 1/1/2013.

Как это проще всего сделать?

Добавлено через 8 минут и 30 секунд
Без модулей.
PM MAIL   Вверх
reiserford
Дата 10.4.2013, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 22
Регистрация: 20.3.2012

Репутация: 1
Всего: 1



разбей каждую до DD, MM, YYYY
каждой сделай sprintf('%04d-%02d-%02d', YYYY, MM, DD) и сравни результаты sprintf
PM   Вверх
Poseidon
Дата 10.4.2013, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: нет
Всего: 133



Формат похож на используемый в Англии и для британских Windows подойдет обычный StrToDate. Но для не британский будет выдавать ошибку. Так что нужно силой указать сепаратор (в русских Windows это точка).

Код

var
   myDate : TDate;
 begin
   DateSeparator:= '/';
   myDate := StrToDate('01/01/2013');
end;

Ну а TDate - это обычный Double и сравнивается операторами сравнения.

Добавлено через 4 минуты и 35 секунд
Ой, сори ребята, разделом уж сильно ошибся smile

Это сообщение отредактировал(а) Poseidon - 10.4.2013, 10:55


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Suppir
Дата 10.4.2013, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Ребята, как думаете, а такой вариант сработает?

Код

$days = $y * 356 + ($m - 1) * 30 + $d;


То есть я просто получаю количество дней, умножая год на 356, месяц - на 30 и прибавляя дни. А потом просто сравниваю количество дней в двух датах.
PM MAIL   Вверх
Jimy
Дата 10.4.2013, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 4.7.2010

Репутация: нет
Всего: 3



Не сработает. 31 января и 1 февраля дадут одинаковое значение.
PM   Вверх
Suppir
Дата 10.4.2013, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Только эти два дня?

Добавлено через 1 минуту и 34 секунды
Да, посчитал - в каждом месяце такая фигня выходит...
PM MAIL   Вверх
arto
Дата 10.4.2013, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



формула вычисления високосных годов известна -- написать функцию не проблема подсчета дней не проблема, imho.
PM MAIL ICQ   Вверх
Suppir
Дата 10.4.2013, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



В общем, определяю так:

Код

sprintf '%04d/%02d/%02d', $y+1900, $m+1, $d;


а потом сравниваю оператором gt. 
PM MAIL   Вверх
krypt3r
Дата 11.4.2013, 06:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 2
Всего: 16



1. Заюзать Delta_Days из Date::Calc
2. Перевести даты в Unixtime или Julian Day и сравнивать
PM MAIL   Вверх
Pfailed
Дата 11.4.2013, 13:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



POSIX::mktime


--------------------
PM MAIL   Вверх
DProf
Дата 11.4.2013, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 28.9.2012

Репутация: 1
Всего: 1



Сравнивать строки - плохо. Чего Вам функция вычисления вычисления юлианского дня не понравилась? Если что, то это количество дней (дробное), прошедшее с 4713 года до нэ. Это уникальное значение. В *NIX время практически так же хранится.
Самому функцию писать не надо даже, если не хотите. Юзайте так:
Код

use Time::JulianDay;
 $jd = julian_day($year, $month_1_to_12, $day);

Сравнить то есть так:
Код

my $JD_1 = julian_day($year_1, $month_1, $day_1);
my $JD_2 = julian_day($year_2, $month_2, $day_2);
 
if ($JD_1 > $JD_2)
{#data_1 more than data_2
}
else
{#data_2 more than data_1
}


Читать
 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
PM MAIL   Вверх
Suppir
Дата 15.4.2013, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Понятно, спасибо. 

Дело не в том, что "не хочу использовать модули". Просто у пользователей - целый зоопарк из разных версий Perl. Нужного модуля может и не быть, а  почти никто не умеет их специально устанавливать. Поэтому приходится писать так, чтобы скрипт работал на любой сборке Perl 5.8 или выше. 
PM MAIL   Вверх
arto
Дата 15.4.2013, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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      
#
PM MAIL ICQ   Вверх
Pilat66
Дата 4.5.2013, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 27.1.2009

Репутация: 1
Всего: 1



Цитата(reiserford @  10.4.2013,  10:51 Найти цитируемый пост)
разбей каждую до DD, MM, YYYY
каждой сделай sprintf('%04d-%02d-%02d', YYYY, MM, DD) и сравни результаты sprintf 


В первом ответе есть совет, может быть без юлианских календарей и високосных секунд будет проще?

#!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);

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0778 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.