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

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 pytz

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版本提供解决方案。

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

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)

is_dst=None断言naive_dt_in_local_timezone存在且不含糊。

虽然您不需要它用于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>)