chevron-left chevron-right

Piotr Nalepa Frontend, architektura i AI

[PERL] obliczanie różnicy między datami

Ta wersja
blog.piotrnalepa.pl/2009/05/30/perl-obliczanie-roznicy-miedzy-datami
Opublikowano
Autor
, Staff Software Engineer
Kategoria
Inne
Uwagi
Napisz do mnie · Napisz na X

Ten wpis ma 17 lat. Od tego czasu przeglądarki i narzędzia mogły się zmienić, więc zanim użyjesz kodu, sprawdź go z aktualną dokumentacją.

Napisz skrypt w języku Perl zawierający dwie tablice przechowujące odpowiednio nazwy miesięcy i ilości dni w miesiącach. Kod skryptu ma wczytać z klawiatury dwie daty w postaci :

nazwa miesiąca słownie oraz numer dnia numerycznie

a następnie obliczyć liczbę dni dzielących obie daty i wypisać wynik.

Przykład 1PERL
#!/usr/bin/perl
use warnings;
 
@miesiace = (   "styczen",
                "luty",
                "marzec",
                "kwiecien",
                "maj",
                "czerwiec",
                "lipiec",
                "sierpien",
                "wrzesien",
                "pazdziernik",
                "listopad",
                "grudzien"      );
 
@dni = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
 
print "Wszystkie miesiące należy podawać słownie, używając tylko małych liter bez polskich znaków.n";
 
print "Podaj pierszą datę (miesiąc dzień): ";
$d1 = <STDIN>;
 
print "Podaj drugą datę (miesiąc dzień): ";
$d2 = <STDIN>;
 
($m1, $d1) =  split(/W/, $d1, 2);
($m2, $d2) =  split(/W/, $d2, 2);
 
if($m1 eq "" || $m2 eq "")
{
  print "Nie podano nazw miesięcy!n";
  exit;
}
if($d1 eq "" || $d2 eq "")
{
  print "Nie podano liczby dni!n";
  exit
}
 
for($i = 0; $i < 12; $i++)
{
  if($miesiace[$i] eq $m1)
  {
    $nr_m1 = $i;
  }
 
  if($miesiace[$i] eq $m2)
  {
    $nr_m2 = $i;
  }
}
 
if(!defined($nr_m1))
{
  print "Nie znaleziono miesiąca $m1!n";
  exit;
}
if(!defined($nr_m2))
{
  print "Nie znaleziono miesiąca $m2!n";
  exit;
}
 
if($d1 > $dni[$nr_m1] || $d1 < 1)
{
  print "Miesiąc $m1 nie ma $d1 dni!n";
  exit;
}
if($d2 > $dni[$nr_m2] || $d2 < 1)
{
  print "Miesiąc $m2 nie ma $d2 dni!n";
  exit;
}
 
if($nr_m1 == $nr_m2)
{
  if($d1 > $d2)
  {
    $suma = $d1 - $d2;
  }
  else
  {
    $suma = $d2 - $d1;
  }
}
else
{
  if($nr_m1 > $nr_m2)
  {
    $tmp_m = $nr_m1;
    $nr_m1 = $nr_m2;
    $nr_m2 = $tmp_m;
 
    $tmp_d = $d1;
    $d1 = $d2;
    $d2 = $tmp_d;
  }
 
  for($i = ($nr_m1 + 1); $i < $nr_m2; $i++)
  {
    $suma += $dni[$i];
  }
 
  $suma += ($dni[$nr_m1] - $d1) + $d2;
}
 
print "Różnica dni wynosi: $suma";
Udostępnij
Uwagi

O autorze

Staff Software Engineer

Piszę na tym blogu od 2009 roku, a strony i aplikacje webowe tworzę zawodowo od 14 lat. Obecnie w Bishop Fox prowadzę frontend platformy Cosmos, od samego początku projektu. Wcześniej pracowałem m.in. w OLX, KUDO, Auto1 i eZ Systems. Piszę tu o tym, czego nauczyłem się w praktyce: o JavaScripcie, TypeScripcie, Reakcie, CSS-ie i architekturze frontendu. Występowałem też jako prelegent na konferencjach w Polsce i Europie. Masz pytanie albo pomysł na wpis? Daj znać!