Time::y2038 - Keine Angst vor dem Schwarzen Dienstag 2038
Veröffentlicht von Thomas Fahle am (Permalink)
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:
- Time::y2038
- Time::y2038::Everywhere
- Journal of schwern: use Time::y2038::Everywhere
- 2008Q2 Grant Proposal - Make localtime() and gmtime() Work Past 2038
- Make localtime() and gmtime() Work Past 2038
- Who's Afraid Of 2038?
- Jahr-2038-Problem - Wikipedia
- The year 2038 bug
- The Project 2038 Frequently Asked Questions (FAQ)
- Year 2038 Bug Strikes Early / taint.org: Justin Mason's Weblog
- Perl: 2038 "Black Tuesday" Bug in Perl 5.8 gmtime and localtime Functions
- DateTime
- DateTime.org
- Apophis