Добре,
Времето е дошло и аз се опитвам да избягамКошмарът на Лари Уол се премества от Perl на Python (за работа). За тази цел се опитвам да премина през интензивно самообучение, за да се трансформирам от средата на нощта каубойски кодер, един човек армия, не-документатор, сигурен съм познавам хора като мен (!), за спокоен ученик на Питонския начин.Освен това се опитвам да бъда смешен тук, така че, моля, носете с мен.: /
За тази цел работя чрез конвертиранеобщ код и помощни програми, които използвам на дневна база от Perl до Python. Тази седмица съм бил инструментариум с библиотека, свързана с DateTime, която написах в Perl в библиотека на Python, която дефинира клас, излагащ същия договор, по-специално създаване на обекти на DateTime в различни часови зони от базата данни Olson. Ето примера в Perl. Трудно ми е да разбера как се прави еквивалентът в Python. Моля, обърнете внимание, че пиша това в 9:56 AM PST:
package MyDateTime;
use Moose;
use DateTime;
has day => (is => "ro", isa => "Int");
has hour => (is => "ro", isa => "Int");
has minute => (is => "ro", isa => "Int");
has month => (is => "ro", isa => "Int");
has second => (is => "ro", isa => "Int");
has timezone => (is => "ro", isa => "Str", required => 1);
has timestamp => (is => "ro", isa => "Num", required => 1);
has year => (is => "ro", isa => "Int");
around BUILDARGS => sub {
my($orig, $class, $timezone, $timestamp) = @_;
my $datetime = DateTime->from_epoch(
epoch => $timestamp,
time_zone => $timezone,
);
return $class->$orig(
day => sprintf("%02d",$datetime->day),
hour => sprintf("%02d",$datetime->hour),
minute => sprintf("%02d",$datetime->minute),
month => sprintf("%02d",$datetime->month),
second => sprintf("%02d",$datetime->second),
timezone => $timezone,
timestamp => $timestamp,
year => $datetime->year,
);
};
__PACKAGE__->meta->make_immutable;
1;
Това създава Perl DateTime обект, чиито стойности отговарят на дадена времева зона. Например в отделен скрипт:
#!/usr/bin/env perl
use Moose;
use MyDateTime;
my $timestamp = time();
my $datetime = MyDateTime->new( "America/Los_Angeles", $timestamp );
print $datetime->hour,"n";
$datetime = MyDateTime->new( "America/New_York", $timestamp );
print $datetime->hour,"n";
Кои отпечатъци:
09
12
Тъй като в момента е 9 часа сутринта в Лос Анджелис и 12 часа в Ню Йорк.
Най-доброто, което успях да направя в Python, е както следва:
import datetime, pytz, time
class DateTime:
def __init__(self, timezone, epoch):
self.timezone = timezone
self.epoch = epoch
timezoneobject = pytz.timezone(timezone)
datetimeobject = datetime.datetime.fromtimestamp( self.epoch )
self.datetime = timezoneobject.localize(datetimeobject)
def hour(self):
return self.datetime.hour
if __name__=="__main__":
epoch = time.time()
dt = DateTime("America/Los_Angeles",epoch)
print dt.datetime
dt = DateTime("America/New_York",epoch)
print dt.datetime
Кои отпечатъци:
9
9
Нямам представа къде става това! Възможно ли е да се постигне същото в Python използване pytz? (Представям си, че е!) Ако е така, моля ви, помогнете!
Благодаря
Отговори:
5 за отговор № 1fromtimestamp може да отнеме часовата зона като втори аргумент. В този случай, fromtimestamp
интерпретира времевия отпечатък като относителен към тази времева зона и връща обект на дата-дата, който е свързан с часовата зона.
import datetime, pytz, time
utc = pytz.utc
class DateTime:
def __init__(self, timezone, epoch):
self.timezone = timezone
self.epoch = epoch
timezoneobject = pytz.timezone(timezone)
self.datetime = datetime.datetime.fromtimestamp(self.epoch, timezoneobject)
def hour(self):
return self.datetime.hour
if __name__=="__main__":
epoch = time.time()
dt = DateTime("America/Los_Angeles",epoch)
print dt.hour()
dt = DateTime("America/New_York",epoch)
print dt.hour()
добиви
10
13
Между другото, именуване на вашия клас DateTime
може да обърка другите програмисти на Python (т.е. мен!), тъй като името на класа звучи същото като datetime
модул в стандартната библиотека. Различните понятия трябва да имат лесно различими имена. Направих безброй грешки, сгрешили едно име, когато имах предвид друго. Можете да си спестите някои проблеми по-късно, като дадете на класа си име, различно от datetime
.