2012-10-20 26 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