Homepage Inspire-world | Forum
CGI/Perl Workshops Beginn und Ende eines Datumsbereiches versch. darstellen

 Inhaltsverzeichnis/Workshops Übersichtsseite/Beginn und Ende eines Datumsbereiches versch. darstellen
Hier will ich zeigen wie man zu einem Datum Tage addiert und diese verschieden ausgibt. Praktisch ist das für Anwendungen die Zeitmäßig begrenzt laufen, z.B. Mitgliederlogins die nach Zeit deaktiviert werden sollen uvam.

1. Zunächst einmal ein komplettes Beispielscript

#!/usr/bin/perl

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

# Differenz zwischen Start und Ablaufdatum in Tagen
$tagesanzahl = 10;

# Aufruf der Subroutine
&datumsroutine;
print "Content-type: text/html\n\n";

# Ausgabe der verschiedenen Datumswerte
print qq~
$heutiges_datum_1
$heutiges_datum_2
$heutiges_datum_3
$heute_in_sec

$ende_datum_1
$ende_datum_2
$ende_datum_3
$ende_in_sec
~;

# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
# Datumsermittlung fuer Anfangs und Ablaufdatum
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
sub datumsroutine {

@aktuell = localtime(time); 
@zukunft = localtime(time+60*60*24*$tagesanzahl); 

($sec,$min,$stunde,$mday,$mon,$jahr,$wday,$yday,$isdst)=@aktuell;
$heute = (Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag)[$aktuell[6]];
$monatkurz = ('Jan.','Feb.','Maerz','Apr.','Mai','Jun.','Jul.','Aug.','Sep.','Okt.','Nov.','Dez.')[$aktuell[4]];
$monatlang = ('Januar','Februar','Maerz','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember')[$aktuell[4]];

if ($stunde < 10) { $stunde = "0$stunde"; }
if ($min < 10) { $min = "0$min"; }
if ($sec < 10){ $sec = "0$sec"; }
$volles_jahr = $jahr + 1900;
$jahr = $jahr - 100;
if ($jahr < 10) { $jahr = "0$jahr"; }
	
$heutiges_datum_1 = "$heute, $mday.$monatkurz $jahr $stunde:$min:$sec";
$heutiges_datum_2 = "$heute, $mday.$monatlang $volles_jahr um $stunde:$min:$sec";
$heutiges_datum_3 = "$mday. $monatkurz $volles_jahr - $stunde:$min:$sec";

($ende_sec,$ende_min,$ende_stunde,$ende_mday,$ende_mon,$ende_jahr,$ende_wday,$ende_yday,$ende_isdst)=@zukunft;
$ende_day = (Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag)[$zukunft[6]];
$ende_monatkurz = ('Jan','Feb','Maerz','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez')[$zukunft[4]];
$ende_monatlang = ('Januar','Februar','Maerz','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember')[$zukunft[4]];	
	
if ($ende_stunde < 10) { $ende_stunde = "0$ende_stunde"; } 
if ($ende_min < 10) { $ende_min = "0$ende_min"; }
if ($ende_sec < 10) { $ende_sec = "0$ende_sec"; }

$vollesende_jahr = $ende_jahr + 1900; 
$ende_jahr = $ende_jahr - 100; 
if ($ende_jahr < 10) { $ende_jahr = "0$ende_jahr"; }

$ende_datum_1 = "$ende_day, $ende_mday. $ende_monatkurz $ende_jahr $ende_stunde:$ende_min:$ende_sec";
$ende_datum_2 = "$ende_day, $ende_mday.$ende_monatlang $vollesende_jahr um $ende_stunde:$ende_min:$ende_sec";
$ende_datum_3 = "$ende_mday. $ende_monatkurz $vollesende_jahr - $ende_stunde:$ende_min:$ende_sec";

$heute_in_sec = time;
$ende_in_sec = time+60*60*24*$tagesanzahl;
}
Scriptausgabe (10 Tage addiert):

Natürlich lassen sich auch noch andere Wertezusammenstellungen erzeugen.
Verschieden formatierte Anfangsdaten $heutiges_datum_1 Samstag, 16. Nov. 02 20:19:42
Verschieden formatierte Anfangsdaten $heutiges_datum_2 Samstag, 16.November 2002 um 20:19:42
Verschieden formatierte Anfangsdaten $heutiges_datum_3 16. Nov. 2002 - 20:19:42
Aktuelle Anfangszeit in Sekunden $heute_in_sec 1037474382
Verschieden formatierte Ablaufdaten $ende_datum_1 Dienstag, 26. Nov 02 20:19:42
Verschieden formatierte Ablaufdaten $ende_datum_2 Dienstag, 26.November 2002 um 20:19:42
Verschieden formatierte Ablaufdaten $ende_datum_3 26. Nov 2002 - 20:19:42
Ablaufzeit in Sekunden $ende_in_sec 1038338382


2. Hier nun das ganze im Detail erläutert

Dieser Wert bestimmt wieviele Tage addiert werden sollen.
$tagesanzahl = 10;

Aufruf der Subroutine und ausgabe des Content Types
&datumsroutine;
print "Content-type: text/html\n\n";
Ausgabe der verschiedenen Datumswerte. Ich hab hier einmal alle die möglich sind dargestellt. Im Anwendungsfall wird man sich für das für den Einsatzzweck passende entscheiden.

Wer sich nun fragt warum die Datumsangaben in der normalen Schreibweise und in Sekunden angegenben werden - die Sekunden sind dann der interne Wert mit dem gerechnet wird. Will man nämlich einfach prüfen ob ein Datum erreicht oder überschritten ist reicht ein Vergleich der Sekundenwerte.
print qq~
$heutiges_datum_1
$heutiges_datum_2
$heutiges_datum_3
$heute_in_sec

$ende_datum_1
$ende_datum_2
$ende_datum_3
$ende_in_sec
~;
Hier nun wird den beiden Arrays die aktuelle und zukünftige Localtime übergeben.
@aktuell = localtime(time); 
@zukunft = localtime(time+60*60*24*$tagesanzahl); 
Bei den Monats und Tageswerten $aktuell[4] und $aktuell[6] wird den "Datumsteilen" vom Localtime ein Wert zugewiesen, nämlich das Deutsche Datumsformat für die Wochentage und Monate.

$sec,$min,$stunde,$mday,$mon,$jahr,$wday,$yday,$isdst

Liste:
$aktuell[0]		$sec		Sekunden
$aktuell[1]		$min		Minuten
$aktuell[2]		$stunde		Stunden
$aktuell[3]		$mday		Tag im Monat
$aktuell[4]		$mon		Monat
$aktuell[5]		$jahr 		Jahr
$aktuell[6]		$wday		Wochentag
$aktuell[7]		$yday		Tag im Jahr
$aktuell[8]		$isdst  	Wahr (0 oder 1, wenn Sommerzeit
Hier nun werden bei den Werten wenn nötig noch führende Nullen zugeordnet.
if ($stunde < 10) { $stunde = "0$stunde"; }
if ($min < 10) { $min = "0$min"; }
if ($sec < 10){ $sec = "0$sec"; }
$volles_jahr = $jahr + 1900;
$jahr = $jahr - 100;
if ($jahr < 10) { $jahr = "0$jahr"; }
Beachten sollte man dies:
$volles_jahr = $jahr + 1900;
$jahr = $jahr - 100;
Will man die Langschreibweise des Jahres so gilt: Jahr + 1900, bei einer Zweistelligen Angabe sind 100 abzuziehen. Plus 1900 deshalb weil das Jahr bei aktuell 2002 mit 102 zurückgegeben wird.


 Zum Inhaltsverzeichnis/Workshops Übersichtsseite/Beginn und Ende eines Datumsbereiches versch. darstellen
Autor: Helmut Walter Homepage Inspire-world Fragen, Anregungen und Hinweise bitte in das Forum

Valid HTML 4.0! Valid CSS!