Homepage Inspire-world | Forum
CGI/Perl Workshops Datumsberechnungen aller Art mit dem Modul Date::Pcalc

 Inhaltsverzeichnis/Workshops Übersichtsseite/Datumsberechnungen aller Art mit dem Modul Date::Pcalc
Datumsberechnungen sind ein Kapitel für sich. Nicht jedoch mit dem richtigen Hilfsmittel. Das Perl Modul Date::Pcalc geschrieben von J. David Eisenberg basierend auf der Grundlage des Date::Calc Modules von Steffen Beyer leistet hier hervorragende Hilfestellung bei verschiedensten Aufgabenstellungen zur Datumsberechnung, Darstellung oder Umwandlung.

Leider ist es so das nicht jeder Provider dieses nützliche Modul installiert hat. Das Date::Pcalc Modul ist aber so ausgelegt das es von jedem genutzt werden kann. Wer es einmal installiert hat wird es mögen und nicht mehr missen wollen.

Die Methode das Modul selbst einzubinden hat auch noch einen anderen großen Vorteil. Im Gegensatz zum Modul was fest in Perl eingebunden ist hat man hier selbst Zugriff auf das Modul und kann es, entsprechende Kenntnisse vorausgesetzt, selbst noch anpassen oder gar erweitern.

Ich werde hier in verschiedenen Abschnitten das einbinden des Modules in Scripte und die Anwendungsmöglichkeiten vorstellen.


Eine Übersicht über die anwendbaren Parameter
Wichtige Hinweise
Einbinden des des Modules in Scripte
Verschiedene Anwendungsbeispiele
Downloads



1. Eine Übersicht über die anwendbaren Parameter

Einbinden des Modules mit allen Parametern die zur Verfügung stehen
use Date::Pcalc qw(:all);
oder nur mit den zur Berechnung benötigten Parametern
use Date::Pcalc qw(
      Days_in_Year
      Days_in_Month
      Weeks_in_Year
      leap_year
      check_date
      check_business_date
      Day_of_Year
      Date_to_Days
      Day_of_Week
      Week_Number
      Week_of_Year
      Monday_of_Week
      Nth_Weekday_of_Month_Year
      Standard_to_Business
      Business_to_Standard
      Delta_Days
      Delta_DHMS
      Add_Delta_Days
      Add_Delta_DHMS
      Add_Delta_YMD
      System_Clock
      Today
      Now
      Today_and_Now
      Easter_Sunday
      Decode_Month
      Decode_Day_of_Week
      Decode_Language
      Decode_Date_EU
      Decode_Date_US
      Compress
      Uncompress
      check_compressed
      Compressed_to_Text
      Date_to_Text
      Date_to_Text_Long
      Calendar
      Month_to_Text
      Day_of_Week_to_Text
      Day_of_Week_Abbreviation
      Language_to_Text
      Language
      Languages
      Decode_Date_EU2
      Decode_Date_US2
      Parse_Date
);

Achtung! Folgende Links öffnen neues Fenster
 
  Days_in_Year
      $days = Days_in_Year($year,$month);

  Days_in_Month
      $days = Days_in_Month($year,$month);

  Weeks_in_Year
      $weeks = Weeks_in_Year($year);

  leap_year
      if (leap_year($year))

  check_date
      if (check_date($year,$month,$day))

  check_business_date
      if (check_business_date($year,$week,$dow))

  Day_of_Year
      $doy = Day_of_Year($year,$month,$day);

  Date_to_Days
      $days = Date_to_Days($year,$month,$day);

  Day_of_Week
      $dow = Day_of_Week($year,$month,$day);

  Week_Number
      $week = Week_Number($year,$month,$day);

  Week_of_Year
      ($week,$year) = Week_of_Year($year,$month,$day);

  Monday_of_Week
      ($year,$month,$day) = Monday_of_Week($week,$year);

  Nth_Weekday_of_Month_Year
      if (($year,$month,$day) =
      Nth_Weekday_of_Month_Year($year,$month,$dow,$n))

  Standard_to_Business
      ($year,$week,$dow) =
      Standard_to_Business($year,$month,$day);

  Business_to_Standard
      ($year,$month,$day) =
      Business_to_Standard($year,$week,$dow);

  Delta_Days
      $Dd = Delta_Days($year1,$month1,$day1,
                       $year2,$month2,$day2);

  Delta_DHMS
      ($Dd,$Dh,$Dm,$Ds) =
      Delta_DHMS($year1,$month1,$day1, $hour1,$min1,$sec1,
                 $year2,$month2,$day2, $hour2,$min2,$sec2);

  Add_Delta_Days
      ($year,$month,$day) =
      Add_Delta_Days($year,$month,$day, $Dd);

  Add_Delta_DHMS
      ($year,$month,$day, $hour,$min,$sec) =
      Add_Delta_DHMS($year,$month,$day, $hour,$min,$sec,
                     $Dd,$Dh,$Dm,$Ds);

  Add_Delta_YMD
      ($year,$month,$day) =
      Add_Delta_YMD($year,$month,$day,
                    $Dy,$Dm,$Dd);

  System_Clock
      ($year,$month,$day, $hour,$min,$sec, $doy,$dow,$dst) =
      System_Clock();

  Today
      ($year,$month,$day) = Today();

  Now
      ($hour,$min,$sec) = Now();

  Today_and_Now
      ($year,$month,$day, $hour,$min,$sec) = Today_and_Now();

  Easter_Sunday
      ($year,$month,$day) = Easter_Sunday($year);

  Decode_Month
      if ($month = Decode_Month($string))

  Decode_Day_of_Week
      if ($dow = Decode_Day_of_Week($string))

  Decode_Language
      if ($lang = Decode_Language($string))

  Decode_Date_EU
      if (($year,$month,$day) = Decode_Date_EU($string))

  Decode_Date_US
      if (($year,$month,$day) = Decode_Date_US($string))

  Compress
      $date = Compress($year,$month,$day);

  Uncompress
      if (($century,$year,$month,$day) = Uncompress($date))

  check_compressed
      if (check_compressed($date))

  Compressed_to_Text
      $string = Compressed_to_Text($date);

  Date_to_Text
      $string = Date_to_Text($year,$month,$day);

  Date_to_Text_Long
      $string = Date_to_Text_Long($year,$month,$day);

  Calendar
      $string = Calendar($year,$month);

  Month_to_Text
      $string = Month_to_Text($month);

  Day_of_Week_to_Text
      $string = Day_of_Week_to_Text($dow);

  Day_of_Week_Abbreviation
      $string = Day_of_Week_Abbreviation($dow);

  Language_to_Text
      $string = Language_to_Text($lang);

  Language
      $lang = Language();
      Language($lang);
      $oldlang = Language($newlang);

  Languages
      $max_lang = Languages();

  Decode_Date_EU2
      if (($year,$month,$day) = Decode_Date_EU2($string))

  Decode_Date_US2
      if (($year,$month,$day) = Decode_Date_US2($string))

  Parse_Date
      if (($year,$month,$day) = Parse_Date($string))


Top

2. Wichtige Hinweise

Ein paar Hinweise...
  • Jahreszahlen sollten immer vierstellig notiert wrden!
  • Alle Werte beginnen mit 1 (Perl fängt für gewöhnlich bei 0 an).
  • Das Modul kann Datumsberechnungen ab Jahr 1 n. Chr verabeiten.
  • Angesichts der vielen Möglichkeiten des Modules Pcalc kann dieser Workshop nur einen kleinen Teil der Möglichkeiten beschreiben.
  • Erfahrungen im Umgang mit Scripten sollten unbedingt vohanden sein wenn man sich mit diesem Modul befasst.
  • Wer Module installiert braucht keinen sonst üblichen CHMOD für Verzeichnis und Modul vergeben. Es empfiehlt sich die Module in seperate Verzeichnisse zu legen.

Top

3. Einbinden des des Modules in Scripte

Hier nun auf in die Praxis. Zum einbinden des Modules Date::Pcalc gibt es zwei Wege:

1. Importieren aller vorhandenen Paramter mit: use Date::Pcalc qw(:all);
#!/usr/bin/perl
# Hier Serverpfad zum Modulverzeichnis angeben
use lib "/serverpfad/zum/verzeichnis/des/modules/cgi-bin/Date/";
# Aufruf des Modules selbst
use Date::Pcalc qw(:all);
... weiterer Code
2. Importieren aller benötigten Paramter mit z.B.: use Date::Pcalc qw(:all);
#!/usr/bin/perl
# Hier Serverpfad zum Modulverzeichnis angeben
use lib "/serverpfad/zum/verzeichnis/des/modules/cgi-bin/Date/";
# Aufruf des Modules selbst
use Date::Pcalc qw(
Calendar
Today
Now
);
... weiterer Code
Wer das Modul schon von Providerseite her installiert vorfindet braucht die Zeile nicht!
Allerdings kann man trotzdem noch "sein" eigenes Modul nutzen wenn man es vielleicht speziell abgestimmt hat.
use lib "/serverpfad/zum/verzeichnis/des/modules/cgi-bin/Date/";

Top

4. Verschiedene Anwendungsbeispiele

1. Einen Datumsbereich prüfen
Dies kann nützlich sein wenn man z.B. Anmeldungen zu einem Event nur in einem bestimmten Zeitraum entgegennehmen will, oder auch für ein Preisausschreiben welches auf einen Einsendeschluss hin prüft.
#!/usr/bin/perl
use CGI::Carp qw(fatalsToBrowser);

# Hier Serverpfad zum Modulverzeichnis angeben
use lib "/serverpfad/zum/verzeichnis/des/modules/cgi-bin/Date/";
# Modulaufruf mit dem Parameter Date_to_Days
use Date::Pcalc qw( Date_to_Days );

# Variablen:
# Datumsbereich Anfang
$year1 = 2002;
$month1 = 7;
$day1 = 12;
# Datumsbereich Ende
$year2 = 2002;
$month2 = 9;
$day2 = 25;
# Datum der geprüft werden soll
# Hier liegt der Datum oberhalb der zulässigen Grenze.
$year = 2002;
$month = 11;
$day = 15;

print "Content-type: text/html\n\n";

$anfang = Date_to_Days($year1,$month1,$day1);
$ende = Date_to_Days($year2,$month2,$day2);

$datum = Date_to_Days($year,$month,$day);

if (($datum <= $anfang) && ($datum >= $ende))
{
print "Der Datum liegt im zulässigen Bereich\n";
}
else
{
print "Der Datum liegt <b>nicht</b> im zulässigen Bereich\n";
}

2. Was für ein Datum ist wann?
Mit diesem Code kann man z.B. einen Erinnerungservice betreiben für Geburtstage, oder auch eine Mitgliedschaft Zeitlich begrenzen. Darüber hinaus ist es möglich eine Erinnerung x Tage früher auszugeben.

Abgefragt wird hier der heutige Datum, zu diesem werden Dann im ersten Schritt die Anzahl Tage $Dd = 210; hinzugezählt. Die zweite Angabe $Dd1 = 7; berechnet dann das Datum an dem erinnert werden soll.

Beide Berechnungen erfolgen mit ($year,$month,$day) = Add_Delta_Days($year,$month,$day, $Dd); und ($year1,$month1,$day1) = Add_Delta_Days($year1,$month1,$day1, -$Dd1);.

Mit $langdatum = Date_to_Text_Long($year1,$month1,$day1); wird der Datum in eine Langschreibweise gewandelt.

Hier nun das komplete Script:
#!/usr/bin/perl

# Fehlermeldungen an Browser ausgeben
use CGI::Carp qw(fatalsToBrowser);

# Pfadangabe zum Modulverzeichnis
use lib "/serverpfad/zum/verzeichnis/des/modules/cgi-bin/Date/";

# Modulaufruf mit Parametern die benoetigt werden
use Date::Pcalc qw( 
Today 
Add_Delta_Days 
Week_Number 
Month_to_Text 
Date_to_Text_Long
);

# Aktuelles Datum
($year,$month,$day) = Today();

# Tage die hinzugezaehlt werden
$Dd = 210;

# Meldung wieviele Tage frueher
$Dd1 = 7;

# Addieren von $Dd zum aktuellen Datum
($year,$month,$day) = Add_Delta_Days($year,$month,$day, $Dd);

# Variablen fuer zweite Datumsberechnung
$year1 = $year;
$month1 = $month;
$day1 = $day;

# Mit -$Dd1 Tage abziehen vom ersten Datum
($year1,$month1,$day1) = Add_Delta_Days($year1,$month1,$day1, -$Dd1);

# Welche Woche ist das denn im Jahr?
$week = Week_Number($year1,$month1,$day1);

# Monat zu Monatsname wandeln
$mo = Month_to_Text($month);
$mo1 = Month_to_Text($month1);

# Datum zu langer Schreibweise wandeln
$langdatum = Date_to_Text_Long($year1,$month1,$day1);

# HTML Ausgabe
print "Content-type: text/html\n\n";
print qq~
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
<META http-equiv="Content-Type" content="text/html">
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">

<title>Datumsberechnung</title>
<style type="text/css">
body {
font: 12px Verdana, Arial
}
</style>
</head>
<body>

In $Dd Tagen ist der $day. $mo $year<br><br> 
Sie werden darüber $Dd1 Tage früher am $langdatum informiert.<br><br>
Das ist die $week. Woche des Jahres $year1<br>

</body>
</html>
~;
Ausgabe:
In 210 Tagen ist der 26. Februar 2003

Sie werden darüber 7 Tage früher am Mittwoch, den 19. Februar 2003 informiert.

Das ist die 8. Woche des Jahres 2003

Top

4. Downloads

Hier das fertig vorbereitete Modul zum Download. Bitte Readme beachten!

Fragen dazu bitte ausschließlich in das Forum posten!
Top


 Zum Inhaltsverzeichnis/Workshops Übersichtsseite/Datumsberechnungen aller Art mit dem Modul Date::Pcalc
Autor: Helmut Walter Homepage Inspire-world Fragen, Anregungen und Hinweise bitte in das Forum

Valid HTML 4.0! Valid CSS!