правильный подход для сравнения дат (в строковом формате) с использованием perl-скрипта - PullRequest
0 голосов
/ 26 сентября 2018

Я новичок в сценариях Perl.Подскажите, пожалуйста, помогите сравнить две даты.у меня есть

my $dt1 = "20171026";
my $dt2 = "20180101";

Я использую приведенный ниже фрагмент для сравнения дат, однако я не уверен, что это правильный путь

use strict; use warnings;

my $dt1 = "20171026";
my $dt2 = "20180101";
if ($dt1 > $dt2){
    print "Hi";
}
else {
print "hello";
}

Может кто-нибудь, пожалуйста, предложите мне, если я могу отформатироватьстрока говорит $ dt1 для формата даты и времени и сравнивает?

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

С вашим сравнением все в порядке.

Так как ваши даты на самом деле являются просто числами, и они в формате YMD, числовое сравнение работает.Компоненты даты отсортированы по значимости, что является ключевым здесь.

  • Год первый: 2017 всегда раньше 2018
  • Месяц второй: октябрь (10) позже января (01), но важен начальный ноль
  • День: то же самое, 05 будет раньше 29

Так что для сравнения

  • 20170101 до 20170102
  • 20180101 после 20171231

, потому что это всего лишь цифры.

Для этого формата абсолютно нет необходимости или выгоды от использования модуля даты и разбора строк.Это не облегчит чтение и не сделает его быстрее.Это только увеличит сложность вашего кода.

0 голосов
/ 26 сентября 2018

Можно сравнить строки с датами в таком формате, как объяснено, но это все, что вы можете сделать.

Конечно, есть библиотеки для работы с датой и временем, как мне кажется, задается вопрос.

Наиболее полным является DateTime , который чрезвычайно округлен по функциональности

use DateTime::Format::Strptime;

my $format = DateTime::Format::Strptime->new( pattern => '%y%m%d' );
my $dt1 = $format->parse_datetime($dt1_str);
my $dt2 = $format->parse_datetime($dt2_str);

if ($dt1 < $dt2) { say $dt1->ymd, " is earlier than ", $dt2->ymd }

Теперь вы можете делать все с этими датами, см. Документацию.

Если вам не нужно много всего делать и вы предпочитаете гораздо более легкий модуль, есть Время :: Кусок

use Time::Piece;

my $dt1 = Time::Piece->strptime($dt1_str, "%Y%m%d");
my $dt2 = Time::Piece->strptime($dt2_str, "%Y%m%d");

if ($dt1 < $dt2) { say $dt1->ymd, " is earlier than ", $dt2->ymd }

, который также проще в использовании, для простых вещей.Он поставляется с несколькими другими удобствами, но если ваши потребности усложняются, будьте осторожны, так как некоторые интерфейсы модуля могут быть сложными.

0 голосов
/ 26 сентября 2018

Если вы используете формат ГГГГММДД (или% Y% m% d), вы можете сравнить даты в виде чисел или строк.Это означает, что оба параметра

$dt1 > $dt2

и

$dt1 gt $dt2

работают правильно.Я предпочитаю использовать сравнение строк (gt ge lt le eq ne), так как мы используем даты не как числа (мы не добавляем к ним числа и т. Д.), А как строки (например, вы можете извлечь год с помощью substr $dt, 0, 4).Кроме того, сравнение строк по-прежнему работает, если вы используете разделитель, например, 2018/09 / 25.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...