在python中指定日期时间所在的时区

时间:2014-04-04 21:40:18

标签: python datetime timezone

我有一个从数据库获取的日期时间,此日期时间是UTC日期时间。但是当我从数据库中提取它时,它并不知道时区。我需要做的是将此日期时间转换为另一个函数的“从纪元开始的秒”。这个问题是,系统的时间是在PST,我无法根据具体原因进行更改。

所以,我想要做的是,从数据库获取此日期时间,并告诉python该日期时间是UTC日期时间。我所做的每一种方式都会因为时区转换而浪费时间或获得时间。同样,不要试图转换时间,只是试图指定它是UTC。

如果有人可以帮助解决这个问题,那就太棒了。

谢谢!

实施例

假设database_function()返回日期时间数据类型为'2013-06-01 01:06:18'

datetime = database_function()
epoch = datetime.strftime('%s')

pytz.utc.localize(database_function()).datetime.strftime('%s')
datetime.replace(tzinfo=pytz.utc).datetime.strftime('%s')

这两个都返回1370077578的纪元时间戳 但是,它应该返回每http://www.epochconverter.com/个时间戳1370048778 请记住,此时间戳是一个utc时间戳

5 个答案:

答案 0 :(得分:3)

使用fabolous pytz

import datetime, pytz
dt = datetime.datetime(...)
utc_dt = pytz.utc.localize(dt)

这将以UTC格式创建一个支持tz的日期时间对象。

答案 1 :(得分:1)

如何Setting timezone in Python这似乎会重置python脚本中的时区。您正在更改系统在指定时间内看到的时区,而不是将指定时间更改为指定时区。您可能希望将其设置为“UTC”

time.tzset()

  

重置库例程使用的时间转换规则   环境变量TZ指定了如何完成此操作。

     

2.3版中的新功能。

     

可用性:Unix。

我的主平台上没有这个,所以我无法测试它。我必须从之前的答案得到这个。

问题上最好的答案是:

>>> import os, time
>>> time.strftime('%X %x %Z')
'12:45:20 08/19/09 CDT'
>>> os.environ['TZ'] = 'Europe/London'
>>> time.tzset()
>>> time.strftime('%X %x %Z')
'18:45:39 08/19/09 BST'
  

获取您列出的具体值:

>>> year = time.strftime('%Y')
>>> month = time.strftime('%m')
>>> day = time.strftime('%d')
>>> hour = time.strftime('%H')
>>> minute = time.strftime('%M')
  

请参阅here以获取完整的指令列表。请记住,strftime()函数将始终返回一个字符串,而不是整数或其他类型。

答案 2 :(得分:1)

这是使用pytz模块的一种方法:

import pytz
utc_datetime = (datetime.datetime(1970, 1, 1, tzinfo=pytz.utc)
                + datetime.timedelta(seconds=seconds_since_epoch)

如果您不想安装pytz模块,可以从datetime文档中复制示例UTC类(搜索“class UTC”):

https://docs.python.org/2/library/datetime.html#tzinfo-objects

答案 3 :(得分:0)

您可以使用pytz,这是一个时区定义包。

from datetime import datetime
from pytz import timezone

fmt = "%Y-%m-%d %H:%M:%S %Z%z"

# Current time in UTC
now_utc = datetime.now(timezone('UTC'))
print now_utc.strftime(fmt)

# Convert to US/Pacific time zone
now_pacific = now_utc.astimezone(timezone('US/Pacific'))
print now_pacific.strftime(fmt)

# Convert to Europe/Berlin time zone
now_berlin = now_pacific.astimezone(timezone('Europe/Berlin'))
print now_berlin.strftime(fmt)

输出:

2014-04-04 21:50:55 UTC+0000
2014-04-04 14:50:55 PDT-0700
2014-04-04 23:50:55 CEST+0200

或者可能有帮助

>> import pytz
>>> import datetime
>>>
>>> now_utc = datetime.datetime.utcnow() #Our UTC naive time from DB,
   for the time being here I'm taking it as current system UTC time..
>>> now_utc
    datetime.datetime(2011, 5, 9, 6, 36, 39, 883479) # UTC time in Naive
   form.
>>>
>>> local_tz = pytz.timezone('Europe/Paris') #Our Local timezone, to
   which we want to convert the UTC time.
>>>
>>> now_utc = pytz.utc.localize(now_utc) #Add Timezone information to
   UTC time.
>>>
>>> now_utc
datetime.datetime(2011, 5, 9, 6, 36, 39, 883479, tzinfo=<UTC>) # The
   full datetime tuple
>>>
>>> local_time = now_utc.astimezone(local\_tz) # Convert to local
   time.
>>>
>>> local_time #Current local time in Paris
datetime.datetime(2011, 5, 9, 8, 36, 39, 883479, tzinfo=<DstTzInfo
   'Europe/Paris' CEST+2:00:00 DST>)

答案 4 :(得分:0)

这里的stdlib解决方案没有三方模块。

  

..,此日期时间是 UTC日期时间。但是当我从数据库中提取它时,它不知道的时区。我需要做的是将此日期时间转换为&#34;秒从epoch&#34; 时间转换为另一个函数。强调是我的

将表示UTC时间的无意识(天真)日期时间对象转换为POSIX时间戳:

from datetime import datetime

timestamp = (dt_from_db - datetime(1970, 1, 1)).total_seconds()

示例:

>>> from datetime import datetime
>>> dt = datetime.strptime('2013-06-01 01:06:18', '%Y-%m-%d %H:%M:%S')
>>> (dt - datetime(1970, 1, 1)).total_seconds()
1370048778.0

请参阅提供各种Python版本解决方案的Converting datetime.date to UTC timestamp in Python

回答标题中的问题:一般来说,你需要pytz库来处理Python中的时区。特别是,您应该使用.localize方法将不知情的日期时间对象转换为时区感知的对象。

import pytz # $ pip install pytz
from tzlocal import get_localzone # $ pip install tzlocal

tz = get_localzone() # local timezone whatever it is (just an example)
aware_dt = tz.localize(naive_dt_in_local_timezone, is_dst=None)

is_dst=None声称naive_dt_in_local_timezone存在并且明确无误。

虽然您不需要UTC时区,因为它在一年中和过去几年中始终具有相同的UTC偏移量(零):

import pytz

aware_dt = utc_dt.replace(tzinfo=pytz.utc)

请参阅Python - simplest and most coherent way to get timezone-aware current time in UTC?(它提供stdlib-only solution):

aware_dt = utc_dt.replace(tzinfo=timezone.utc)