Specify which timezone a datetime is in, in python
我有一个从数据库中得到的日期时间,这个日期时间是一个UTC日期时间。但当我从数据库中提取它时,它并不知道时区。我需要做的是将这个日期时间转换为另一个函数的"从epoch开始的秒"。问题是,系统的时间是在PST上的,我不能因为特定的原因更改它。
所以,我想做的是,从数据库中获取这个日期时间,并告诉python这个日期时间是一个UTC日期时间。我这样做的每一种方式,都会导致它由于时区转换而损失时间或获得时间。同样,不要试图转换时间,只需指定它是UTC。
如果有人能帮忙,那就太好了。
谢谢!
例子
假定database_function()返回日期时间数据类型"2013-06-01 01:06:18"
1 2 3 4 5 | 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时间戳
使用Fablous
1 2 3 | import datetime, pytz dt = datetime.datetime(...) utc_dt = pytz.utc.localize(dt) |
这将创建一个支持TZ的日期时间对象(UTC)。
下面是一种使用PYTZ模块的方法:
1 2 3 | 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对象
在python中设置时区怎么样?这似乎是为了重置python脚本中的时区。您正在更改系统在给定时间看到的时区,而不是将指定时间更改为指定时区。您可能想将其设置为"UTC"
时间TSSET()
Resets the time conversion rules used by the library routines.
The environment variable TZ specifies how this is done.New in version 2.3.
Availability: Unix.
我的家庭平台上没有这个,所以我无法测试它。我必须从前面的答案中得到这个。
这个问题的最佳答案是:
1 2 3 4 5 6 7 | >>> 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' |
To get the specific values you've listed:
1 2 3 4 5 | >>> year = time.strftime('%Y') >>> month = time.strftime('%m') >>> day = time.strftime('%d') >>> hour = time.strftime('%H') >>> minute = time.strftime('%M') |
See here for a complete list of directives. Keep in mind that the strftime() function will always return a string, not an integer or other type.
这里是没有三方模块的仅stdlib解决方案。
.., this datetime is a UTC datetime. But when i pull it from the DB, it is unaware of the timezone. What i need to do, is convert this datetime to a"seconds from epoch" time for another function.emphasize is mine
要将表示UTC时间的未意识(天真)日期时间对象转换为POSIX时间戳,请执行以下操作:
1 2 3 | from datetime import datetime timestamp = (dt_from_db - datetime(1970, 1, 1)).total_seconds() |
例子:
1 2 3 4 | >>> 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中将datetime.date转换为UTC时间戳,该时间戳为各种python版本提供解决方案。
要回答标题中的问题:通常,您需要
1 2 3 4 5 | 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) |
虽然您不需要它用于UTC时区,因为它在一年中和过去的所有年份中始终具有相同的UTC偏移量(零):
1 2 3 | import pytz aware_dt = utc_dt.replace(tzinfo=pytz.utc) |
请看python——以UTC格式获取时区感知当前时间的最简单、最连贯的方法?(它只提供stdlib解决方案):
1 | aware_dt = utc_dt.replace(tzinfo=timezone.utc) |
您可以使用pytz,这是一个时区定义包。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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) |
输出:
1 2 3 | 2014-04-04 21:50:55 UTC+0000 2014-04-04 14:50:55 PDT-0700 2014-04-04 23:50:55 CEST+0200 |
或者有什么帮助
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | >> 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>) |