/ Използване на Olson Timezones в Python - python, datetime, локализация, часови пояс

Използване на Olson Timezones в Python - python, datetime, локализация, часова зона

Добре,

Времето е дошло и аз се опитвам да избягамКошмарът на Лари Уол се премества от 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 за отговор № 1

fromtimestamp може да отнеме часовата зона като втори аргумент. В този случай, 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.