出色地,
时候到了,我正试图摆脱 Larry Wall 的噩梦,从 Perl 转向 Python(为了工作)。为此,我正在通过密集的自学来从一个半夜的牛仔编码员、一个男人的军队、非文档员,我相信你认识像我这样的人(!),转变为 Pythonic 方式的和平学生. 我也想在这里搞笑,所以请多多包涵。:/
为此,我正在努力将我每天使用的通用代码和实用程序从 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;
这将创建一个 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 中完成相同的操作?(我想是的!)如果是这样,请帮忙!
谢谢