我有一个从数据库获取的日期时间,此日期时间是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时间戳
答案 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”
重置库例程使用的时间转换规则 环境变量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)