[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Omaha.pm] Strftime between Linux/Unix and Windows differences.
Ran into an interesting gotcha between Perl on Linux and Perl on Windows. See this example code:
$ cat -n ./d0039.pl
1 #!perl
2 use strict;
3 use POSIX;
4 my $epoc_sec = 1296482400;
5 printf ("%s\n", strftime("%A, %B %e %Y at %l:%M%p", localtime($epoc_sec)));
6 my $TT=localtime($epoc_sec);
7 print qq{$TT \n};On my Linux system:
$ perl ./
d0039.pl
Monday, January 31 2011 at 8:00AM
Mon Jan 31 08:00:00 2011
But when run from my Windows box (Win 7, 64bit) using ActiveState:
C:\temp>perl
d0039.pl%A, %B %e %Y at %l:%M%p
Mon Jan 31 08:00:00 2011
After a bit of Googling, I found this section from the POSIX documentation:
http://perldoc.perl.org/POSIX.html
If you want your code to be portable, your format (fmt ) argument should use only the conversion specifiers defined by the ANSI C standard (C89, to play safe). These are aAbBcdHIjmMpSUwWxXyYZ% . But even then, the results of some of the conversion specifiers are non-portable. For example, the specifiers aAbBcpZchange according to the locale settings of the user, and both how to set locales (the locale names) and what output to expect are non-standard. The specifier c changes according to the timezone settings of the user and the timezone computation rules of the operating system. The Z specifier is notoriously unportable since the names of timezones are non-standard. Sticking to the numeric specifiers is the safest route.
What I don't get is why ALL of my formatting code entries don't seem to be accepted in the strftime() call...
DanL
--
***************** ************* *********** ******* ***** *** **
"Quis custodiet ipsos custodes?"
(Who can watch the watchmen?)
-- from the Satires of Juvenal
"I do not fear computers, I fear the lack of them."
-- Isaac Asimov (Author)
** *** ***** ******* *********** ************* *****************