2012-10-20 46 views
2

好,使用Python中奧爾森時區

的時間到了,我試圖逃跑Larry Wall的惡夢,在Perl移動到Python(工作)。爲此,我正在通過深入的自我學習,從一個深夜牛仔編碼員,一個人的軍隊,非記錄員,我相信你知道像我這樣的人(!),一個和平的學生Pythonic的方式。我也想在這裏很有趣,所以請耐心等待。 :/

爲此,我正在通過將通用代碼和實用程序從Perl轉換爲Python的工作。本週,我一直使用我在Perl中編寫的DateTime相關庫來模擬Python庫,該庫定義了暴露相同合約的類,特別是在Olson數據庫的各個時區中創建DateTime對象。這裏是Perl中的例子。我很難理解如何在Python中完成等價物。請注意我在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 

我不知道這是怎麼回事錯在這裏!使用pytz可以在Python中完成相同的功能嗎? (我想它是!)如果是這樣,請幫助!

由於

回答

5

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

+0

繁榮!謝謝!!! – mobiusinversion

+0

當然,命名是關鍵,任何建議的Python風格? – mobiusinversion

+0

最重要的是要保持一致,並與您合作的人員保持一致。大多數人(或多或少)符合[PEP8](http://www.python.org/dev/peps/pep-0008/)。對於類名,這意味着使用CamelCase,但是你會注意到,標準庫本身打破了這個:'datetime.datetime','collections。defaultdict'等。 – unutbu