gpt4 book ai didi

python - 在 Python 中使用 Olson 时区

转载 作者:行者123 更新时间:2023-11-28 22:01:28 26 4
gpt4 key购买 nike

嗯,

时候到了,我正在努力摆脱 Larry Wall 的噩梦,从 Perl 转向 Python(为了工作)。为此,我正在通过密集的自学,从一个半夜的牛仔编码员、一名士兵、非文档 worker ,我相信你认识像我这样的人(!),转变为一个和平的 Pythonic 方式的学生.另外,我想在这里变得有趣,所以请多多包涵。 :/

为此,我正在努力将我每​​天使用的通用代码和实用程序从 Perl 转换为 Python。本周我一直在使用我在 Perl 中编写的与 DateTime 相关的库进行加工,并将其写入 Python 库中,该库定义了一个公开相同契约(Contract)的类,特别是从 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 中完成相同的操作? (我想是的!)如果是这样,请帮忙!

谢谢

最佳答案

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 模块相同.不同的概念应该有易于区分的名称。我犯了无数错误,当我指的是另一个名字时,错误地输入了一个名字。您可以通过为您的类(class)指定一个明显不同于 datetime 的名称来为自己省去一些麻烦。

关于python - 在 Python 中使用 Olson 时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12990781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com