Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Вернуть дату в заданном формате


Автор: Suppir 7.10.2010, 13:01
Добрый день!

Поделитесь, пожалуйста, функцией для вывода даты в формате

гг.мм.дд - чч.мм.
(год, месяц, день, часы, минуты из двух цифр)


Чтобы работало на любом Perl без доп. модулей.

Автор: Jimy 7.10.2010, 13:17
нет такой функции ("без доп. модулей").
можно реализовать комбинированием localtime и sprintf.

Автор: Suppir 7.10.2010, 13:22
Пишу:

Код

if (@time = localtime()){
    @time[5] = @time[5]+1900;
    $dirToCreate = "@time[5].@time[4].@time[3] - @time[2].@time[1]";
    Encode::from_to($dirToCreate, 'cp866', 'windows-1251');
    mkdir $dirToCreate;
}


Вроде бы нормально, но все элементы (год, месяц, день, час, минуты) должны быть из двух цифр.



Хорошо, а со стандартными модулями, идущими в комплекте ActivePerl и Strawberry Perl можно сделать?

Автор: arto 7.10.2010, 13:42
perldoc POSIX на предмет strftime
POSIX -- стандартный модуль.

Автор: Suppir 7.10.2010, 13:52
Кажется, он тогда месяцы буквами выводит.

Добавлено через 9 минут и 15 секунд
Остановился на такой страшной самодельной функции:

Код

if (@time = localtime()){
    my $year = @time[5]+1900;
    $year = sprintf("%02d", $year % 100);
    my $month = sprintf("%02d", @time[4]);
    my $day = sprintf("%02d", @time[3]);
    my $hour = sprintf("%02d", @time[2]);
    my $minute = sprintf("%02d", @time[1]);
    $dirToCreate = "сравнение от $year.$month.$day - $hour.$minute";
    Encode::from_to($dirToCreate, 'cp866', 'windows-1251');
    mkdir $dirToCreate;
}

Автор: KSURi 7.10.2010, 14:40
Код

sprintf "%i.%02i.%02i - %02i.%02i", sub { $_[0] = ($_[0] + 1900) % 100; $_[1]++; @_ }->(reverse((localtime)[1 .. 5]))

Обратите внимание, что к месяцу надо прибавить единичку, т.к. нумерация начинается с нуля.
Вообще лучше почитать доку по strftime и найти нужный формат)

Автор: Suppir 7.10.2010, 15:45
KSURi, спасибо, а я и не заметил!

Автор: Suppir 7.10.2010, 16:17
KSURi, вылетает ваш код почему-то.

Пишу
Код

$a=sprintf "%i.%02i.%02i - %02i.%02i", sub { $_[0] = ($_[0] + 1900) % 100; $_[1]++; @_ }->(reverse((localtime)[1 .. 5]));
print $a;
<>


вылетает с ошибкой.

Автор: KSURi 7.10.2010, 19:16
Сочувствую. У меня работает.

Автор: maxgray 12.10.2010, 05:58
Код

#!/usr/bin/perl -w
use POSIX qw(strftime);
$date = (strftime("%y.%m.%d %H:%M", localtime));
print $date;

Автор: Vaneska 12.10.2010, 15:10
Вот еще вариант на тему strftime
Код

use Time::Piece;
print localtime->strftime('%y.%m.%d %H:%M');

А вообще модуль хороший. Кучу всего умеет

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)