Time::y2038 - Keine Angst vor dem Schwarzen Dienstag 2038

| | Kommentare (0)

Das Jahr-2038-Problem kann möglicherweise zu Softwareausfällen im Februar 2038 auf 32-Bit-Systemen führen.

Michael Schwern's Time::y2038 schafft auf besonders einfache Art und Weise Abhilfe für Legacy Cody.

Für Windows steht Time::y2038 leider noch nicht zur Verfügung.

Beispiel mit 2038-Bug:

#!/usr/bin/perl
use strict;
use warnings;
#
# Based on http://maul.deepsky.com/~merovech/2038.perl.txt
#

# Zeitzone auf GMT aka UTC setzen
$ENV{'TZ'} = "GMT";

# Epochsekunden kurz vor bzw. nach dem kritischen Event
# in einer Schleife durchlaufen und pruefen, ob Datum 
# und Uhrzeit korrekt ausgegeben werden.
my $clock;
for ($clock = 2147483641; $clock < 2147483651; $clock++) {
	 print scalar localtime($clock), "\n";
}

Ausgabe auf einem 32-Bit Linux:

Tue Jan 19 03:14:01 2038
Tue Jan 19 03:14:02 2038
Tue Jan 19 03:14:03 2038
Tue Jan 19 03:14:04 2038
Tue Jan 19 03:14:05 2038
Tue Jan 19 03:14:06 2038
Tue Jan 19 03:14:07 2038
Fri Dec 13 20:45:52 1901
Fri Dec 13 20:45:53 1901
Fri Dec 13 20:45:54 1901

Auf 32-Bit Unix/Linux-Systemen wird die Zeit auf den 13. Dezember 1901 gesetzt.

Ausgabe auf einem 32-Bit Windows:

Tue Jan 19 04:14:01 2038
Tue Jan 19 04:14:02 2038
Tue Jan 19 04:14:03 2038
Tue Jan 19 04:14:04 2038
Tue Jan 19 04:14:05 2038
Tue Jan 19 04:14:06 2038
Tue Jan 19 04:14:07 2038

Das Programm stoppt genau nach der kritischen Sekunde im Jahr 2038.

Beispiel mit Time::y2038

Dank Time::y2038 muss nur eine Zeile Code hinzugefügt werden und das Programm ist Jahr-2038-fest.

#!/usr/bin/perl
use strict;
use warnings;

use Time::y2038;
#
# Based on http://maul.deepsky.com/~merovech/2038.perl.txt
#

# Zeitzone auf GMT aka UTC setzen
$ENV{'TZ'} = "GMT";

# Epochsekunden kurz vor bzw. nach dem kritischen Event
# in einer Schleife durchlaufen und pruefen, ob Datum 
# und Uhrzeit korrekt ausgegeben werden.
my $clock;
for ($clock = 2147483641; $clock < 2147483651; $clock++) {
	 print scalar localtime($clock), "\n";
}

Ausgabe des Programms (Linux)

Tue Jan 19 03:14:01 2038
Tue Jan 19 03:14:02 2038
Tue Jan 19 03:14:03 2038
Tue Jan 19 03:14:04 2038
Tue Jan 19 03:14:05 2038
Tue Jan 19 03:14:06 2038
Tue Jan 19 03:14:07 2038
Tue Jan 19 03:14:08 2038
Tue Jan 19 03:14:09 2038
Tue Jan 19 03:14:10 2038

Datumsberechnungen (nicht nur über das Jahr 2038 hinaus)

Wer Datumsberechnungen (nicht nur über das Jahr 2038 hinaus) sicher durchführen möchte, sollte sich ohnehin nicht auf time() und Epochal-Sekunden verlassen, sondern besser ein CPAN-Modul wie Date::Calc oder DateTime verwenden.

Beispiel:

use strict;
use warnings;

use DateTime;

my $dt = DateTime->now();  

print $dt->iso8601() , "\n";

$dt->add(years => 200);

print $dt->iso8601() , "\n";

Siehe auch:

Jetzt kommentieren

Über diese Seite

Diese Seite enthält einen einen einzelnen Eintrag von Thomas Fahle vom 20.05.09 10:15.

Perldoc::Server - Perl-Dokumentation griffbereit mit Hyperlinks und Syntaxhighlighting ist der vorherige Eintrag in diesem Blog.

CPAN::Mini::Webserver - Komfortable Suche im lokalen CPAN-Mirror ist der nächste Eintrag in diesem Blog.

Aktuelle Einträge finden Sie auf der Startseite, alle Einträge in den Archiven.

Blog Roll

Powered by

Powered by Movable Type 5.2.10

Creative Commons-Lizenz

Creative Commons License
Dieses Weblog steht unter einer Creative Commons-Lizenz.