Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> localtime, не правильно дату передает 
:(
    Опции темы
Agares
  Дата 30.9.2008, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 376
Регистрация: 20.5.2007
Где: Минск

Репутация: нет
Всего: нет



Использую так:
Код

my $date = localtime->mday . localtime->mon . localtime->year+1900;

выдает не правильную дату (310008, хотя должна выдавать 300908)

где моя ошибка?

Это сообщение отредактировал(а) Agares - 30.9.2008, 14:29


--------------------
Мой ноут: Impression First 657
ОС: Gentoo Linux
PM MAIL WWW Skype GTalk   Вверх
ginnie
Дата 30.9.2008, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый Agares, использую так

Код

perl -e 'my $date = localtime->mday . localtime->mon . localtime->year+1900; print $date;'


Выдает

Код

Can't locate object method "mday" via package "Tue Sep 30 15:30:02 2008" (perhaps you forgot to load "Tue Sep 30 15:30:02 2008"?) at -e line 1.


 smile 

Где моя ошибка?

P.S.

Код

perl -e 'my $date = "20"."30"+100; print $date;'


выдает 2130, т.к. у операторов + и . одинаковый приоритет и они выполняются последовательно слева направо.



Это сообщение отредактировал(а) ginnie - 30.9.2008, 14:38


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
amg
Дата 30.9.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(Agares @  30.9.2008,  14:28 Найти цитируемый пост)
Использую так:
А почему не так, как предлагают в документации?
Код
my ($mday,$mon,$year) = (localtime)[3..5];
my $date = sprintf '%d.%02d.%02d', $mday, $mon+1,($year+1900)%100;

PM MAIL   Вверх
ginnie
Дата 30.9.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



amg, это кто такое ($year+1900)%100 в документации предлагает?  smile 

Это сообщение отредактировал(а) ginnie - 30.9.2008, 14:55


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
amg
Дата 30.9.2008, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(ginnie @  30.9.2008,  14:55 Найти цитируемый пост)
amg, это кто такое ($year+1900)%100 в документации предлагает?
Там есть строки
Код
$year += 1900;
$year = sprintf("%02d", $year % 100);
Ну а преобразовать их в ($year+1900)%100 я сам сообразил  smile 

PM MAIL   Вверх
KSURi
Дата 30.9.2008, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



UPD:
сори, не так понял вопрос

Это сообщение отредактировал(а) KSURi - 30.9.2008, 15:06


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
ginnie
Дата 30.9.2008, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



amg, в документации это написано последовательно (по тексту), но не означает, что так и надо писать (все вместе) smile

($year+1900)%100 от $year % 100 отличается только лишним сложением, электроэнергию надо экономить  smile 


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
amg
Дата 30.9.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(ginnie @  30.9.2008,  15:11 Найти цитируемый пост)
($year+1900)%100 от $year % 100 отличается только лишним сложением, электроэнергию надо экономить
(Тут должен быть смайлик, стучащий себя по лбу)

PM MAIL   Вверх
ginnie
Дата 30.9.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Кстати, по поводу основного вопроса, рекомендовал другим модуль B::Deparse, а сам не пользуюсь  smile 

Код

perl -MO=Deparse,-p -e 'my $date = localtime->mday . localtime->mon . localtime->year+1900;'


дает

Код

(my $date = (((localtime->mday . localtime->mon) . localtime->year) + 1900));


Это сообщение отредактировал(а) ginnie - 30.9.2008, 16:58


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
KSURi
Дата 30.9.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



ginnie, так ведь выше сами написали, что у . и + одинаковый приоритет.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
ramus
Дата 30.9.2008, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

Репутация: 1
Всего: 1



Кстати, насчет электричества smile

пользуюсь гдето подсмотренным вариантом, использующим только один системный вызов функции localtime
почему то мне кажется что так нагрузка на сервер будет меньше

$s = sprintf "%4d/%02d/%02d %02d:%02d:%02d: prg_name(perl): Begin work\n", 
        sub{($_[5]+1900, $_[4]+1, $_[3], $_[2], $_[1], $_[0])}->(localtime);

это как рабочий пример, естественно без sprintf электроэнергии еще меньше тратится smile
правда она тогда в тепло выделяется :(

еще примеры (зато работают smile
Код

$YY     = sprintf "%02d",sub{(substr($_[5]+1900,2,2))}->(localtime);
$YYMMDD = sprintf "%02d%02d%02d",sub{(substr($_[5]+1900,2,2),$_[4]+1, $_[3])}->(localtime);
$DDMM   = sprintf "%02d%02d",sub{($_[3], $_[4]+1)}->(localtime);
$JJJ    = sprintf "%03d",sub{($_[7])}->(localtime);
$MM     = sprintf "%02d",sub{($_[4]+1)}->(localtime);



Это сообщение отредактировал(а) ramus - 30.9.2008, 22:16
PM MAIL   Вверх
ginnie
Дата 1.10.2008, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



ramus, за такое

Цитата

$s = sprintf "%4d/%02d/%02d %02d:%02d:%02d: prg_name(perl): Begin work\n", 
        sub{($_[5]+1900, $_[4]+1, $_[3], $_[2], $_[1], $_[0])}->(localtime);


надо на кол и премию вручать, посмертно  smile
Как только не изголяются программисты, чтобы написать все в одну строку!  smile 

Завтра сравним по производительности с моим любимым вариантом

Код

my @localtime = (localtime())[5,4,3,2,1,0];
$localtime[0] += 1900;
$localtime[1]++;
my $s = sprintf("%4d/%02d/%02d %02d:%02d:%02d: prg_name(perl): Begin work\n", @localtime);


Что-то мне подсказывает, что мой вариант...  smile 

Это сообщение отредактировал(а) ginnie - 1.10.2008, 11:34


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
rcdimon
Дата 1.10.2008, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: 1
Всего: 2



Я ваще вот так деаю всегда 

Код

my ($sec, $n_min, $n_hour, $n_mday, $n_mon, $n_year, $n_wsday, $n_yday, $n_isdst)=localtime;
$n_year+=1900;
$n_mon++;
my $mydate = $year . '-' . $mon . '-' . $mday;


 smile 
PM MAIL ICQ   Вверх
ginnie
Дата 1.10.2008, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Провел тестирование двух вариантов, разница в производительности практически отсутствует.

Код

use strict;
use warnings;

use Test::Timestamp;

my $timer = Test::Timestamp->new();

$timer->stamp('start test 1');
for ( my $counter = 0 ; $counter < 10000 ; $counter++ ) {
    my @localtime = ( localtime() )[ 5, 4, 3, 2, 1, 0 ];
    $localtime[0] += 1900;
    $localtime[1]++;
    my $s = sprintf( "%4d/%02d/%02d %02d:%02d:%02d: prg_name(perl): Begin work\n", @localtime );
}
$timer->stamp('stop test 1');
$timer->stamp('start test 2');
for ( my $counter = 0 ; $counter < 10000 ; $counter++ ) {
    my $s = sprintf "%4d/%02d/%02d %02d:%02d:%02d: prg_name(perl): Begin work\n",
      sub { ( $_[5] + 1900, $_[4] + 1, $_[3], $_[2], $_[1], $_[0] ) }->(localtime);

}
$timer->stamp('stop test 2');


результаты такие:

Код

#              Time:    Increment: Label
           0.000066:     0.000066: start test 1
           0.155115:     0.155049: stop test 1
           0.155131:     0.000016: start test 2
           0.318173:     0.163042: stop test 2


Код

#              Time:    Increment: Label
           0.000200:     0.000200: start test 1
           0.154849:     0.154649: stop test 1
           0.154862:     0.000013: start test 2
           0.317820:     0.162959: stop test 2






--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
arto
Дата 1.10.2008, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



# perl -MBenchmark -e 'sub A () { my @a = localtime; return ( @a[0..3],$a[4]+1,$a[5]+1900 
} sub B () { return sub { @_[0..3],$_[4]+1,$_[5]+1900 }->(localtime) } timethese ($ARGV[0],{ A => \&A,B => \&B
)' 10000000
Benchmark: timing 10000000 iterations of A, B...
         A: 143 wallclock secs (75.38 usr + 58.65 sys = 134.03 CPU) @ 74610.16/s (n=10000000)
         B: 125 wallclock secs (63.99 usr + 58.12 sys = 122.11 CPU) @ 81893.37/s (n=10000000)
# print -f "%.2f%%\\n" $[(81893.37-74610.16)/74610.16*100]
9.76%
#
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.