python - 在 Python 中使用 Olson 时区

标签 python datetime localization timezone

嗯,

时机已到,我正试图逃离 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 中完成相同的任务? (我想是的!)如果是这样,请帮忙!

谢谢

最佳答案

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明显不同的名称来为自己省去一些麻烦。

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

相关文章:

python - 当外键约束是复合主键的一部分时,依赖规则试图在 SQLAlchemy 中清除主键

python - 修复无向 networkx 图中边的排序

python - 迭代从 excel 文件列创建的 pandas 数据框时出错

datetime - Java 8 - ChronoUnit.MONTHS.between(fromDate,toDate) 未按预期工作

javascript - i18n JavaScript 设置

javascript - 如何在react-native中使用i18n-js将组件渲染为参数?

python - Django 如何使用参数表单上下文预填充表单字段

java - 如何使用 Java 中的 Joda 日期/时间库获取 "today"的日期/时间范围?

JavaScript 时间倒退

c# - 如何确定 ASP MVC 中的小数点分隔符