diff --git a/VMX/Common.pm b/VMX/Common.pm index e3e8e1f..c8762ed 100644 --- a/VMX/Common.pm +++ b/VMX/Common.pm @@ -26,7 +26,7 @@ our @EXPORT_OK = qw( HASHARRAY quotequote min max trim htmlspecialchars strip_tags strip_unsafe_tags file_get_contents dbi_hacks ar1el filemd5 mysql_quote updaterow_hashref insertall_hashref deleteall_hashref dumper_no_lf str2time callif urandom - normalize_url utf8on mysql2time mysqllocaltime + normalize_url utf8on rfrom_to mysql2time mysqllocaltime ); our %EXPORT_TAGS = (all => [ @EXPORT_OK ]); @@ -452,18 +452,20 @@ sub dumper_no_lf # str2time, принимающий формат даты вида DD.MM.YYYY my $init; +my $orig_DIRussian; sub str2time { my ($str) = @_; my $time; - my $codeset = langinfo(CODESET()); - Date_Init(@DATE_INIT), $init = 1 unless $init; - Encode::_utf8_on($str) if $codeset =~ /utf-?8/iso; + unless ($init) + { + $orig_DIRussian = \&Date::Manip::_Date_Init_Russian; + *Date::Manip::_Date_Init_Russian = \&date_init_russian; + Date_Init(@DATE_INIT); + $init = 1; + } $str = lc $str; - $time = $str; - Encode::_utf8_off($time); - Encode::from_to($time, $codeset, "koi8-r"); - $time = UnixDate(ParseDate($time),"%s"); + $time = UnixDate(ParseDate($str),"%s"); return $time if defined $time; $time = $str; $time =~ s/(\d{2})\.(\d{2})\.(\d{4})/$2\/$1\/$3/gso; @@ -471,6 +473,15 @@ sub str2time return $time; } +sub date_init_russian +{ + my $r = &$orig_DIRussian(@_); + rfrom_to($_[0], 'koi8-r', 'utf-8'); + utf8on($_[0]); + $_[0]->{month_abb}->[1]->[2] = 'мар'; + return $r; +} + # если значение - вернуть значение, если coderef - вызвать и вернуть значение sub callif { @@ -569,5 +580,23 @@ sub mysqllocaltime return (); } +# рекурсивная версия from_to +sub rfrom_to +{ + if (ref($_[0]) && $_[0] =~ /HASH/so) + { + rfrom_to($_[0]->{$_}, $_[1], $_[2]) for keys %{$_[0]}; + } + elsif (ref($_[0]) && $_[0] =~ /ARRAY/so) + { + rfrom_to($_, $_[1], $_[2]) for @{$_[0]}; + } + else + { + Encode::from_to($_[0], $_[1], $_[2]); + } + return $_[0]; +} + 1; __END__