PhillipHuang has asked for the wisdom of the Perl Monks concerning the following question:

OS: Ubuntu 10.04 2.6.32-25 Perl Version: 5.10.1 Description: When use "+" op to add two created $date, it will always has locale warning messages. While it still can return the correct summary result. Reproduce steps: 1. As following "http://search.cpan.org/~bbeausej/Date-Handler- 1.2/Handler.pod#Using_Date::Handler::Delta_objects", create the below codes named "date.pl"
#!/usr/bin/perl # name: date.pl use strict; use warnings; use Date::Handler; use Date::Handler::Delta; my $delta = new Date::Handler::Delta([1,0,0,0,0,0]); my $date = new Date::Handler({ date => time } ); #$newdate is now one year in the furure. my $newdate = $date+$delta;
2. run it at command line, warnings displayed:
phillip@Athen:~/script$ perl date1.pl Locale en_US does not seem to be implemented on this system, keeping locale Locale en_US does not seem to be implemented on this system, keeping locale Locale en_US does not seem to be implemented on this system, keeping locale
3. display OS locale parameters and modify the code,
phillip@Athen:~/script$ locale LANG=zh_CN.utf8 LANGUAGE=zh_CN:zh LC_CTYPE="zh_CN.utf8" LC_NUMERIC="zh_CN.utf8" LC_TIME="zh_CN.utf8" LC_COLLATE="zh_CN.utf8" LC_MONETARY="zh_CN.utf8" LC_MESSAGES="zh_CN.utf8" LC_PAPER="zh_CN.utf8" LC_NAME="zh_CN.utf8" LC_ADDRESS="zh_CN.utf8" LC_TELEPHONE="zh_CN.utf8" LC_MEASUREMENT="zh_CN.utf8" LC_IDENTIFICATION="zh_CN.utf8" LC_ALL=
#!/usr/bin/perl use strict; use warnings; use Date::Handler; use Date::Handler::Delta; my $delta = new Date::Handler::Delta({ date=>[1,0,0,0,0,0], time_zone=>'Asia/Shanghai', locale=>'zh_CN.utf8', }); my $date = new Date::Handler({ date=>time, time_zone=>'Asia/Shanghai', locale=>'zh_CN.utf8', }); my $newdate = $date + $delta;
4. run again:
phillip@Athen:~/script$ perl date.pl Locale en_US does not seem to be implemented on this system, keeping locale Locale en_US does not seem to be implemented on this system, keeping locale
5. if add "#" to line:"my $newdate = $date + $delta;", save and run again. no warning messages. Phillip

Replies are listed 'Best First'.
Re: locale warnings when exec "+" op
by zwon (Abbot) on Nov 11, 2010 at 15:54 UTC

    If you look onto implementation of Add in Date::Handler source you will see the source of the problem (I think):

    my $newdate = ref($self)->new({ date => $epoch, time_zone => $self->Ti +meZone() });

    As you can see it creates new Date::Handler object inside, and ignores locale attribute of the current object. So new object uses default locale which is en_US. I hope the patch that you will attach to bug report will be applied soon ;)

    Also, have a look onto other modules for manipulations with dates. DateTime is quite popular nowadays.

      Hello zwon, thanks for your reply. I have tried to write a patch to fix this issue.
      phillip@athens:~/script/Date-Handler-1.2$ cat locale.patch --- Handler.pm.original 2010-11-12 16:49:31.817657134 +0800 +++ Handler.pm 2010-11-12 16:42:35.153656643 +0800 @@ -541,7 +541,7 @@ my $epoch = $self->{epoch}; - my $newdate = ref($self)->new({ date => $epoch, time_zone => +$self->TimeZone() }); + my $newdate = ref($self)->new({ date => $epoch, time_zone => +$self->TimeZone(), locale => $self->Locale() }); my $self_array = $newdate->AsArray(); #Take care of the months. @@ -554,7 +554,7 @@ $self_array->[0] += $years; my $posix_date = ref($self)->new({ date => $self_array, - time_zone => $self->TimeZone(), + time_zone => $self->TimeZone(), locale => $s +elf->Locale() }); if($self->INTUITIVE_MONTH_CALCULATIONS())
      and I find a early mistaken in first post inwhich "Date::Handler::Delta" would not include locale and timezone. here's the modified codes and run without warning messages about locale.
      #!/usr/bin/perl #name: date.pl use strict; use warnings; use Date::Handler; use Date::Handler::Delta; my $delta = new Date::Handler::Delta([3,0,0,0,0,0]); my $date = new Date::Handler({ date=>time, time_zone=>'Asia/Shanghai', locale=>'zh_CN.utf8', }); my $newdate = $date + $delta; print "date=$date\n"; print "delta=$delta\n"; print "newdate=$newdate\n";