Zwei rfc-5322 Datumsfunktionen (Test)
Beat
- perl
Zwei Datumsfunktionen nach RFC 5322 (Update von RFC 2822) sind für Perl hier gepostet.
Nach meinen bisherigen Tests verlaufen sie OK.
Jedoch wäre es gut, wenn sie unter anderen locales, eventuell solchen,
die eine extravagante Zeitzone aufweisen, getestet werden könnten.
Falls jemand Lust oder Gelegenheit für Tests hat, nehme ich gerne Ergebnisse entgegen.
Zur Info
RFC 2822 und RFC 5322 sind Teil des MIME Corpus.
Die hier geposteten Datumsformate sind verbindlich für den Mailverkehr.
Eine Besonderheit des Standards sagt, dass ein Agent, der bei einer ermittelten Zeitzone eine lokale zeit verwendet,
aber der Zeitzonen-Unterschied 0000 beträgt, ein '-' voranhängen muss.
Dadurch wird diese Zeitangabe als lokale Zeit ersichtlich.
#!perl
#
#!/usr/bin/perl
use warnings;
use strict;
use constant { NL => "\n", };
BEGIN {
use CGI::Carp qw(carpout);
open(LOG, ">","error.txt") or die "Unable to append to error.txt: $!\n";
carpout(*LOG);
}
foreach my $t (1230764890, 1234567890){
print 'Epochensekunden: ', $t,NL,
'local: ', rfc5322_date_local($t),NL,
'gmt: ', rfc5322_date_gmt($t),NL;
}
<>;
# Datumsformat nach RFC 5322 (Update von RFC 2822) für lokale Zeit
# Ermittelt korrekt den Timeoffset. liefert korrekt '-0000'
# berücksichtigt Zeitzonen mit Minutenabweichungen relativ zu GMT
sub rfc5322_date_local{
my @gmt = ( gmtime( $_[0] ) );
my @local = ( localtime( $_[0] ) );
my $tzm = 60 * ( $local[2] - $gmt[2] )
+ $local[1] - $gmt[1]
+ ( $local[5] <=> $gmt[5]
||
$local[7] <=> $gmt[7] )
* 24 * 60;
return(
sprintf( "%s, %2d %s %04d %02d:%02d:%02d %s%02d%02d",
qw(Sun Mon Tue Wed Thu Fri Sat)[ $local[6] ],
$local[3],
qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[ $local[4] ],
$local[5] + 1900,
$local[2], $local[1], $local[0],
( $tzm > 0 ? '+' : '-' ),
int( $tzm / 60 ),
int( $tzm % 60 ),
)
);
}
# Datumsformat nach RFC 5322 (Update von RFC 2822) für GMT Zeit (=UTC)
sub rfc5322_date_gmt{
my @gmt = ( gmtime( $_[0] ) );
return(
sprintf( "%s, %2d %s %04d %02d:%02d:%02d +0000",
qw(Sun Mon Tue Wed Thu Fri Sat)[ $gmt[6] ],
$gmt[3],
qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[ $gmt[4] ],
$gmt[5] + 1900,
$gmt[2], $gmt[1], $gmt[0],
)
);
}
Ausgabe dieses Scripts:
Epochensekunden: 1230764890
local: Thu, 1 Jan 2009 00:08:10 +0100
gmt: Wed, 31 Dec 2008 23:08:10 +0000
Epochensekunden: 1234567890
local: Sat, 14 Feb 2009 00:31:30 +0100
gmt: Fri, 13 Feb 2009 23:31:30 +0000
mfg Beat
hi,
Ausgabe dieses Scripts:
Epochensekunden: 1230764890
local: Thu, 1 Jan 2009 00:08:10 +0100
gmt: Wed, 31 Dec 2008 23:08:10 +0000
Epochensekunden: 1234567890
local: Sat, 14 Feb 2009 00:31:30 +0100
gmt: Fri, 13 Feb 2009 23:31:30 +0000
Krieg ich auch mit Deinem Code, btw., meine eigenen Funktionen, die TZ ermitteln, sehen ganz ähnlich aus.
Hotte
Ausgabe dieses Scripts:
Epochensekunden: 1230764890
local: Thu, 1 Jan 2009 00:08:10 +0100
gmt: Wed, 31 Dec 2008 23:08:10 +0000
Epochensekunden: 1234567890
local: Sat, 14 Feb 2009 00:31:30 +0100
gmt: Fri, 13 Feb 2009 23:31:30 +0000Krieg ich auch mit Deinem Code, btw., meine eigenen Funktionen, die TZ ermitteln, sehen ganz ähnlich aus.
Ja das vermute ich schon. Wir haben wahrscheinlich beide MEZ im locale.
Wenn ich jetzt locale abhängig testen will, darf ich bei meinem Windows die Ländergebietsschema Einstellung zehnmal ändern.
Die Frage ist, kann ich das für einen Test kürzer haben.
mfg Beat