Aktuelles Datum -3 Tage
Peter
- perl
Hallo zusammen,
mein Problem ist folgendes: Das aktuelle Datum auszugeben ist nicht allzu schwer, ich brauch aber das Datum von vor 3 Tagen. Kann mir da jemand vielleicht auf die Sprünge helfen? Das Datumsformat sollte dann so aussehen: 2005-06-05. Also Jahr, Tag, Monat. Einstellige Tage und Monate sollten noch eine 0 vorangestellt bekommen.
Danke schonmal für Eure Hilfe.
Gruß Peter
hi Peter,
mein Problem ist folgendes: Das aktuelle Datum auszugeben ist nicht allzu schwer, ich brauch aber das Datum von vor 3 Tagen. Kann
$time = time; # Seconds since begin of the epoch 1.1.1970
$time = $time - 3 * 86400; # 3 Tage zurück
mir da jemand vielleicht auf die Sprünge helfen? Das Datumsformat sollte dann so aussehen: 2005-06-05. Also Jahr, Tag, Monat. Einstellige Tage und Monate sollten noch eine 0 vorangestellt bekommen.
Kein Problem mit strftime:
use POSIX qw(strftime);
$date = strftime("%d.%m.%Y", localtime(time()));
%d %m %Y sind Formate, siehe
man date
auf ner LINUX - Kiste.
Viele Grüße, Rolf
Moin!
$time = $time - 3 * 86400; # 3 Tage zurück
Auch du hast die Sommerzeitumstellung vergessen.
Super. Danke für Eure Antworten.
MfG
Peter
Moin!
$time = $time - 3 * 86400; # 3 Tage zurück
Auch du hast die Sommerzeitumstellung vergessen.
Unsinn.
Die PERL Funktion time() hat mit Sommerzeit absolut nichts zu tun.
Viele Grüße, Rolf
Tipp: gmtime(), localtime() ;-)
$time = $time - 3 * 86400; # 3 Tage zurück
Auch du hast die Sommerzeitumstellung vergessen.
Unsinn.
Die PERL Funktion time() hat mit Sommerzeit absolut nichts zu tun.
Nein. Aber die Tatsache, dass nicht alle Tage im Jahr 24 Stunden haben.
hi!
Die PERL Funktion time() hat mit Sommerzeit absolut nichts zu tun.
Nein. Aber die Tatsache, dass nicht alle Tage im Jahr 24 Stunden haben.
time gibt die Anzahl der Sekunden seit einem bestimmten Datum zurück, zum
Beispiel seit dem 1. Januar 1970, 0:00:00 UTC. Die Anzahl der Sekunden
springt aber nicht wild hin und her, nur weil gerade irgendwo auf Sommerzeit
oder Winterzeit umgestellt wurde.
time Returns the number of non-leap seconds since whatever time the
system considers to be the epoch, suitable for feeding to
"gmtime" and "localtime". On most systems the epoch is 00:00:00
UTC, January 1, 1970; a prominent exception being Mac OS Clas-
sic which uses 00:00:00, January 1, 1904 in the current local
time zone for its epoch.
bye, Frank!
Hi,
time gibt die Anzahl der Sekunden seit einem bestimmten Datum zurück, zum
Beispiel seit dem 1. Januar 1970, 0:00:00 UTC. Die Anzahl der Sekunden
springt aber nicht wild hin und her, nur weil gerade irgendwo auf Sommerzeit
oder Winterzeit umgestellt wurde.
Es geht auch nicht um das Ergebnis von time, sondern um die Tatsache, daß ein Tag nicht immer 86400 Sekunden hat (wegen der Sommerzeit-Umstellung hat ein Tag im Jahr 3600 Sekunden mehr und einer 3600 Sekunden weniger).
Es geht also um den Teil " - 3 * 86400".
cu,
Andreas
Moin!
Es geht auch nicht um das Ergebnis von time, sondern um die Tatsache, daß ein Tag nicht immer 86400 Sekunden hat (wegen der Sommerzeit-Umstellung hat ein Tag im Jahr 3600 Sekunden mehr und einer 3600 Sekunden weniger).
Es geht also um den Teil " - 3 * 86400".
Tatsächlich hat ein Tag natürlich immer 24 Stunden, auch die Tage der Zeitumstellung, aber man wechselt dort eben die Zeitzone, von MEZ auf MESZ, und das führt zu einer Differenz von einer Stunde.
Es besteht also das Problem, die Zeitzonenumrechnung korrekt durchzuführen. Wenn man ein Datum hat, dann kann man den Weg über die Sekunden gehen, dazu muß man dann aber genau wissen, ob das Tagesdatum plus Uhrzeit (ist die Frage, welche Zeit man da nimmt, 0 Uhr bietet sich an) nun Sommerzeit oder Winterzeit ist. Diesen Zeitpunkt rechnet man dann auf GMT um (-1/-2 Stunden), addiert oder subtrahiert dann die Zahl der Sekunden, rechnet das Ergebnis dann wieder passend (je nachdem, ob es Sommer- oder Winterzeit ist) zurück in MEZ oder MESZ - und stellt fest, dass man beim Übergang von Sommer- zu Winterzeit trotzdem eine Differenz von einer Stunde hat, man also nicht wieder genau bei 0 Uhr landet. Ist ja auch logisch, weil die Zeitzone ja gewechselt wurde. Und diese Differenz versaut einem dann das Datum.
Es empfiehlt sich deshalb, eben gerade nicht mit der Zahl der Sekunden zu rechnen, die ein 24-Stunden-Tag lang ist.
Hi,
Tatsächlich hat ein Tag natürlich immer 24 Stunden, auch die Tage der Zeitumstellung, aber man wechselt dort eben die Zeitzone, von MEZ auf MESZ, und das führt zu einer Differenz von einer Stunde.
Das hängt von der Definition von "Tag" ab (1 Erd-Rotation bzw. Zeit von Mitternacht bis Mitternacht bzw. sonstwas) ;-)
cu,
Andreas
Hallo,
Es besteht also das Problem, die Zeitzonenumrechnung korrekt durchzuführen.
Soweit ich weiss wird bei Perl dies von localtime automatisch durchgeführt. Also sollte die einfache Subtraktion (bzw. Addition) der gewünschten Zeitspanne in Sekunden von dem durch time ermittelten aktuellen Zeitpunkt der gewünschte Zeitpunkt ermittelt werden. Eine Berücksichtigung der allfälligen Sommerzeit ist unnötig solange am System die richtige Zeitzone eingestellt ist. Dann passen auch die Zeitpunkte der Umstellung.
Grüße
Klaus
Hi,
Soweit ich weiss wird bei Perl dies von localtime automatisch durchgeführt.
Ja, für das aktuelle Datum wird das berücksichtigt.
Also sollte die einfache Subtraktion (bzw. Addition) der gewünschten Zeitspanne in Sekunden von dem durch time ermittelten aktuellen Zeitpunkt der gewünschte Zeitpunkt ermittelt werden.
Aber gerade die Anzahl der zu addierenden/subtrahierenden Sekunden ist ja das Problem - es reicht eben nicht, die Anzahl der Tage mit 86400 zu multiplizieren.
cu,
Andreas
Hallo,
Aber gerade die Anzahl der zu addierenden/subtrahierenden Sekunden ist ja das Problem - es reicht eben nicht, die Anzahl der Tage mit 86400 zu multiplizieren.
Wer sagt das und wodurch wird das begründet? Und was hast Du durch Tests ermittelt?
$time = time;
for($i=0;$i<400;$i++)
{
print scalar(localtime($time))."\n";
$time -= 86400;
}
Diesen Code bitte mit unterschiedlichen Zeitzonen ausprobieren, und sich freuen, dass da einige bei der Implementierung von localtime mitgedacht haben, was auch der 9. Rückgabewert der Funktion im Listenkontext mehr als nur andeutet.
Nochmals: Warum kratzen, wenn's nicht juckt.
Grüße
Klaus
Hi,
Wer sagt das und wodurch wird das begründet? Und was hast Du durch Tests ermittelt?
Daß es eben nicht funktioniert.
$time = time;
for($i=0;$i<400;$i++)
{
print scalar(localtime($time))."\n";
$time -= 86400;
}
Kleine Modifikation, um das Problem zu zeigen:
Ich ziehe nur einmal am Anfang 15 Stunden ab - damit die ursprüngliche Zeit zwischen 0 und 1 Uhr liegt:
$time = time - 15*3600;
for($i=0;$i<400;$i++)
{
print scalar(localtime($time))."\n";
$time -= 86400;
}
Das Ergebnis (gekürzt):
Sat May 7 00:33:08 2005
Fri May 6 00:33:08 2005
Thu May 5 00:33:08 2005
...
Tue Mar 29 00:33:08 2005
Mon Mar 28 00:33:08 2005
Sat Mar 26 23:33:08 2005
Fri Mar 25 23:33:08 2005
...
Tue Nov 2 23:31:35 2004
Mon Nov 1 23:31:35 2004
Sun Oct 31 23:31:35 2004
Sun Oct 31 00:31:35 2004
Sat Oct 30 00:31:35 2004
Fri Oct 29 00:31:35 2004
...
Beachte dabei den 27. März und den 31. Oktober (Tage der Zeitumstellung)
Nochmals: Warum kratzen, wenn's nicht juckt.
Warum nicht waschen, es kratzt doch ...
cu,
Andreas
Es geht auch nicht um das Ergebnis von time, sondern um die Tatsache, daß ein Tag nicht immer 86400 Sekunden hat (wegen der Sommerzeit-Umstellung hat ein Tag im Jahr 3600 Sekunden mehr und einer 3600 Sekunden weniger).
Es geht also um den Teil " - 3 * 86400".
Ok, habe ich verstanden.
Führt aber "nur" zum Fehler, wenn es gerade Mitternacht ist (+/-1 Stunde, je nachdem, ob Sommer- oder Winterumschaltung war) UND die Umschaltung innerhalb der 3 Tage stattfand.
Oder?
Gruß
Reiner
Hi,
Führt aber "nur" zum Fehler, wenn es gerade Mitternacht ist (+/-1 Stunde, je nachdem, ob Sommer- oder Winterumschaltung war) UND die Umschaltung innerhalb der 3 Tage stattfand.
In diesem speziellen Fall: ja.
Aber das reicht doch, um die Methode als "nicht zuverlässig" zu kennzeichnen.
cu,
Andreas
Hallo Peter,
mein Problem ist folgendes: Das aktuelle Datum auszugeben ist nicht allzu schwer, ich brauch aber das Datum von vor 3 Tagen. Kann mir da jemand vielleicht auf die Sprünge helfen? Das Datumsformat sollte dann so aussehen: 2005-06-05. Also Jahr, Tag, Monat. Einstellige Tage und Monate sollten noch eine 0 vorangestellt bekommen.
Du brauchst zuerst mal die Funktion time(), sie gibt dir den aktuellen Unix-Zeitstempel. Von dem Rückgabewert ziehst du nun die Zahl 259200 ab (60*60*24*3 = 259200, d.h. drei Tage entsprechen 259200 Sekunden). Das Ergebnis dieser Berechnung kannst du nun an localtime() oder gmtime() weitergeben.
Viele Grüße
Patrick Canterino
Moin!
Von dem Rückgabewert ziehst du nun die Zahl 259200 ab (60*60*24*3 = 259200, d.h. drei Tage entsprechen 259200 Sekunden).
Was ist mit der Sommerzeit? Einmal im Jahr ist ein Tag 25 Stunden lang, einmal nur 23 Stunden.
weis nicht genau wie das in perl aussieht aber das wäre es in php:
date('Y-m-d',time()-3600*24*3)
weis nicht genau wie das in perl aussieht aber das wäre es in php:
date('Y-m-d',time()-3600*24*3)
in PERL ganz ähnlich:
use POSIX qw(strftime);
my $vorvorgestern = strftime("%Y-%m-%d", (localtime(time - 86400 * 3)) );
print "$vorvorgestern\n"; # 2005-05-03
Gruss, Rolf
Formate zu date:
Hier die komplette Liste der Formate (man date auf debian):
FORMAT controls the output. The only valid option for the
second form specifies Coordinated Universal Time. Inter
preted sequences are:
%% a literal %
%a locale's abbreviated weekday name (Sun..Sat)
%A locale's full weekday name, variable length (Sun
day..Saturday)
%b locale's abbreviated month name (Jan..Dec)
%B locale's full month name, variable length (Jan
uary..December)
%c locale's date and time (Sat Nov 04 12:02:33 EST
1989)
%d day of month (01..31)
%D date (mm/dd/yy)
%e day of month, blank padded ( 1..31)
%h same as %b
%H hour (00..23)
%I hour (01..12)
%j day of year (001..366)
%k hour ( 0..23)
%l hour ( 1..12)
%m month (01..12)
%M minute (00..59)
%n a newline
%p locale's AM or PM
%r time, 12-hour (hh:mm:ss [AP]M)
%s seconds since `00:00:00 1970-01-01 UTC' (a GNU
extension)
%S second (00..60)
%t a horizontal tab
%T time, 24-hour (hh:mm:ss)
%U week number of year with Sunday as first day of
week (00..53)
%V week number of year with Monday as first day of
week (01..53)
%w day of week (0..6); 0 represents Sunday
%W week number of year with Monday as first day of
week (00..53)
%x locale's date representation (mm/dd/yy)
%X locale's time representation (%H:%M:%S)
%y last two digits of year (00..99)
%Y year (1970...)
%z RFC-822 style numeric timezone (-0500) (a nonstan
dard extension)
%Z time zone (e.g., EDT), or nothing if no time zone
is determinable
By default, date pads numeric fields with zeroes. GNU
date recognizes the following modifiers between `%' and a
numeric directive.
Moin!
weis nicht genau wie das in perl aussieht aber das wäre es in php:
date('Y-m-d',time()-3600*24*3)
Das Problem ist nur, dass zwei Tage im Jahr nicht 24 Stunden lang sind. Mit deinem Vorschlag fällst du also mindestens einmal im Jahr für einen Zeitraum von 3 Tagen auf die Nase, mit Pech auch zweimal.
ein tag hat doch ca. 24h oder?
versteh nicht ganz was gemeint ist,...
Moin!
ein tag hat doch ca. 24h oder?
Sommerzeitumstellung.
Hi,
ein tag hat doch ca. 24h oder?
Sommerzeitumstellung.
was ändert sich an der Datumberechnung dadurch?
Gruß
Reiner
Hi,
was ändert sich an der Datumberechnung dadurch?
Wenn Du das Datum des 25-Stunden-Tages hast (ohne Zeitangabe wird 0:00 Uhr genommen) und dazu 24 Stunden hinzuzählst, landest Du bei 23:00 desselben Tages (um 03:00 wurde ja auf 02:00 zurückgestellt) - und nicht bei 0:00 Uhr des nächsten Tags.
cu,
Andreas
Moin!
mein Problem ist folgendes: Das aktuelle Datum auszugeben ist nicht allzu schwer, ich brauch aber das Datum von vor 3 Tagen. Kann mir da jemand vielleicht auf die Sprünge helfen? Das Datumsformat sollte dann so aussehen: 2005-06-05. Also Jahr, Tag, Monat. Einstellige Tage und Monate sollten noch eine 0 vorangestellt bekommen.
In PHP würde ich strtotime() empfehlen, und da die Grundlage dieser Funktion die glibc-Bibliothek ist, sollte dies auch in Perl zur Verfügung stehen. Damit kannst du als Stringtext einfach drei Tage vom aktuellen (oder jedem anderen) Datum abziehen, die Bibliothek rechnet dir das korrekte Datum (mit Sommerzeit und Schaltjahren etc.) dann aus.
http://de2.php.net/manual/de/function.strtotime.php
Und per Google schnell gefunden:
http://www.perlunity.de/php/manual/function.strtotime.shtml
Moin!
Und per Google schnell gefunden:
http://www.perlunity.de/php/manual/function.strtotime.shtml
Dumme Frage: Wieso gibts bei PERLunity das PHP-Handbuch. Gar nicht gesehen auf die Schnelle. Im Zweifel gibts für Perl aber ein CPAN-Modul dafür. :)
Hallo Sven,
Dumme Frage: Wieso gibts bei PERLunity das PHP-Handbuch. Gar nicht gesehen auf die Schnelle. Im Zweifel gibts für Perl aber ein CPAN-Modul dafür. :)
Die Funktion Add_Delta_Days() aus Date::Calc hört sich interessant an, ob sie die Sommerzeit berücksichtigt, weiß ich aber nicht.
Viele Grüße
Patrick Canterino
Hi,
Dumme Frage: Wieso gibts bei PERLunity das PHP-Handbuch. Gar nicht gesehen auf die Schnelle. Im Zweifel gibts für Perl aber ein CPAN-Modul dafür. :)
Die Funktion Add_Delta_Days() aus Date::Calc hört sich interessant an, ob sie die Sommerzeit berücksichtigt, weiß ich aber nicht.
die Sommerzeit ist bzgl. der Ausgangsfrage auch völlig unerheblich.
Die Zeitumstellung hat am Datum noch nie etwas geändert.
Gruß
Reiner
Hi,
die Sommerzeit ist bzgl. der Ausgangsfrage auch völlig unerheblich.
Die Zeitumstellung hat am Datum noch nie etwas geändert.
Am Datum nicht, aber an der Länge des Tages - diese ist zwar im Durchschnitt immer noch 86400 Sekunden bzw. 24 Stunden, aber an einem Tag im Jahr sind es nur 23 Stunden und an einem Tag sind es 25 Stunden.
Wenn für die Berechnung des Datums für die Differenz eine konstante Tageslänge verwendet wird, obwohl in der Realität die Tageslänge nicht konstant ist, gibt es selbstverständlich Fehler.
cu,
Andreas