2

上手、

その時が来て、私はLarry Wallの悪夢から逃れ、PerlからPythonに(仕事のために)移行しようとしています。この目的のために、私は集中的な自己学習を行い、真夜中のカウボーイコーダー、一人の軍隊、非ドキュメンテーションから、私のような人々(!)を知っていると確信しています。 。また、私はここで面白くしようとしているので、我慢してください。:/

この目的のために、私は日常的に使用する一般的なコードとユーティリティをPerlからPythonに変換する作業を行っています。今週は、Perlで書いたDateTime関連のライブラリを使用して、同じコントラクトを公開するクラスを定義するPythonライブラリを作成しました。特に、OlsonデータベースからさまざまなタイムゾーンでDateTimeオブジェクトを作成しました。これがPerlの例です。Pythonで同等の処理がどのように行われるかを理解するのに苦労しています。太平洋標準時午前9時56分にこれを書いていることに注意してください。

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;

これにより、指定されたタイムゾーンに対応する値を持つPerlDateTimeオブジェクトが作成されます。たとえば、別のスクリプトでは次のようになります。

#!/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

現在、LAでは午前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

ここでこれがどこで間違っているのかわかりません!pytzを使用してPythonで同じことを達成することは可能ですか?(そうだと思います!)もしそうなら助けてください!

ありがとう

4

1 に答える 1

5

fromtimestampは、2番目の引数としてタイムゾーンを取ることができます。その場合、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

于 2012-10-20T17:25:21.663 に答える