Вопрос по timezone, python – Как напечатать дату и время Python в местном часовом поясе?

18

Допустим, у меня есть переменная t, для которой установлено следующее:

datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=<UTC>)

Если я говорюstr(t), я получил:

'2009-07-10 18:44:59.193982+00:00'

Как я могу получить похожую строку, кроме как в местном часовом поясе, а не в UTC?

местный для чего? Alex Pavlov

Ваш Ответ

6   ответов
22

http://docs.python.org/library/datetime.html#datetime.datetime.astimezone

Также смотрите модуль pytz - он довольно прост в использовании - как пример:

eastern = timezone('US/Eastern')

http://pytz.sourceforge.net/

Пример:

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

utc_dt = datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=pytz.utc)
print(utc_dt.astimezone(get_localzone())) # print local time
# -> 2009-07-10 14:44:59.193982-04:00
@Muhail - Нет, потому что результирующий объект не знает дату и время. Вы не знаете, в каком часовом поясе вы находитесь.
@Philluminati:tzlocal.get_localzone() дает вам ваш местный часовой пояс.
Итак, как мне узнать текущий часовой пояс? mike
Этот ответ неверен. Я живу в Англии и США / Восток не являетсяlocal часовой пояс.
не является datetime.datetime (2009, 7, 10, 18, 44, 59, 193982) - что вам нужно?
0

import time, datetime
def nowString():
    # we want something like '2007-10-18 14:00+0100'
    mytz="%+4.4d" % (time.timezone / -(60*60) * 100) # time.timezone counts westwards!
    dt  = datetime.datetime.now()
    dts = dt.strftime('%Y-%m-%d %H:%M')  # %Z (timezone) would be empty
    nowstring="%s%s" % (dts,mytz)
    return nowstring

Поэтому интересная часть для вас, вероятно, - строка, начинающаяся с & quot; mytz = ... & quot ;. time.timezone возвращает местный часовой пояс, хотя и с противоположным знаком по сравнению с UTC. Таким образом, он говорит "-3600" выразить UTC + 1.

Несмотря на невежество в отношении перехода на летнее время (летнее время, см. Комментарий), я оставляю это для людей, которые возятся сtime.timezone.

-1. Это даст неверный результат в половине случаев, если вы находитесь в часовом поясе, в котором используется летнее время.time.timezone содержит смещение к UTC, которое используется, когда DST не действует, независимо от того, действует ли он в данный момент.
10

LocalTimezone класс, определенный вdatetime.tzinfo документацияhttp://docs.python.org/library/datetime.html#tzinfo-objects и прокрутите вниз до «Примеры классов tzinfo». раздел):

Если предположить,Local является примеромLocalTimezone

t = datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=utc)
local_t = t.astimezone(Local)

затемstr(local_t) дает:

'2009-07-11 04:44:59.193982+10:00'

чего ты хочешь

(Примечание: это может показаться вам странным, потому что я нахожусь в Новом Южном Уэльсе, Австралия, что составляет 10 или 11 часов.ahead UTC)

Я думаю, что аргумент astimezone должен быть пустым:t.astimezone()
Если вы определили Local для документов datetime, это также работает:str(datetime.datetime.now(tz=Local))
LocalTimezone может потерпеть неудачу за прошлые даты, если основнойtime Реализация не использует историческую базу данных часовых поясов (Windows особенно относится к этой категории).
Имейте в виду, что при этом будет распечатано любое использование со смещением UTC, которое действует в настоящее время, которое может не совпадать с тем, которое было или будет действовать во время, указанноеdatetime экземпляр (из-за летнего времени).
1

используя только стандартные библиотечные функции:

u_tm = datetime.datetime.utcfromtimestamp(0)
l_tm = datetime.datetime.fromtimestamp(0)
l_tz = datetime.timezone(l_tm - u_tm)

t = datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=l_tz)
str(t)
'2009-07-10 18:44:59.193982-07:00'

Просто нужно использоватьl_tm - u_tm или жеu_tm - l_tm в зависимости от того, хотите ли вы показывать + или - часы от UTC. Я нахожусь в MST, откуда -07. Разумный код должен быть в состоянии выяснить, какой способ вычитать.

И только нужно рассчитать местный часовой пояс один раз. Это не изменится. По крайней мере, пока вы не переключитесь с / на летнее время.

0

пояс, используяastimezone():

#!/usr/bin/env python3

import pytz
from datetime import datetime, timezone
from tzlocal import get_localzone

utc_dt = datetime.now(timezone.utc)

PST = pytz.timezone('US/Pacific')
EST = pytz.timezone('US/Eastern')
JST = pytz.timezone('Asia/Tokyo')
NZST = pytz.timezone('Pacific/Auckland')

print("Pacific time {}".format(utc_dt.astimezone(PST).isoformat()))
print("Eastern time {}".format(utc_dt.astimezone(EST).isoformat()))
print("UTC time     {}".format(utc_dt.isoformat()))
print("Japan time   {}".format(utc_dt.astimezone(JST).isoformat()))

# Use astimezone() without an argument
print("Local time   {}".format(utc_dt.astimezone().isoformat()))

# Use tzlocal get_localzone
print("Local time   {}".format(utc_dt.astimezone(get_localzone()).isoformat()))

# Explicitly create a pytz timezone object
print("Local time   {}".format(utc_dt.astimezone(NZST).isoformat()))

Это выводит следующее:

$ ./timezones.py 
Pacific time 2019-02-22T17:54:14.957299-08:00
Eastern time 2019-02-22T20:54:14.957299-05:00
UTC time     2019-02-23T01:54:14.957299+00:00
Japan time   2019-02-23T10:54:14.957299+09:00
Local time   2019-02-23T14:54:14.957299+13:00
Local time   2019-02-23T14:54:14.957299+13:00
Local time   2019-02-23T14:54:14.957299+13:00

Обратите внимание, что вызовastimezone() без часового пояса объект по умолчанию является локальной зоной. Это означает, что вам не нужно импортироватьtzlocal, Я не совсем уверен, что это всегда безопасно по сравнению с использованиемtzlocal get_localzoneМожет, кто-то может прокомментировать?

0

datetime_to_local_timezone(), который кажется слишком запутанным, но я не нашел более простой версии функции, которая преобразуетdatetime экземпляр к местному часовому поясу, как настроено вoperating system, со смещением UTC, которое было в силеat that time:

import time, datetime

def datetime_to_local_timezone(dt):
    epoch = dt.timestamp() # Get POSIX timestamp of the specified datetime.
    st_time = time.localtime(epoch) #  Get struct_time for the timestamp. This will be created using the system's locale and it's time zone information.
    tz = datetime.timezone(datetime.timedelta(seconds = st_time.tm_gmtoff)) # Create a timezone object with the computed offset in the struct_time.

    return dt.astimezone(tz) # Move the datetime instance to the new time zone.

utc = datetime.timezone(datetime.timedelta())
dt1 = datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, utc) # DST was in effect
dt2 = datetime.datetime(2009, 1, 10, 18, 44, 59, 193982, utc) # DST was not in effect

print(dt1)
print(datetime_to_local_timezone(dt1))

print(dt2)
print(datetime_to_local_timezone(dt2))

Этот пример печатает четыре даты. Для двух моментов времени, по одному в январе и по одному в июле 2009 года, каждый печатает метку времени один раз в UTC и один раз в местном часовом поясе. Здесь, когда CET (UTC + 01: 00) используется зимой, а CEST (UTC + 02: 00) используется летом, он печатает следующее:

2009-07-10 18:44:59.193982+00:00
2009-07-10 20:44:59.193982+02:00

2,009-01-10 18:44:59.193982+00:00
2009-01-10 19:44:59.193982+01:00
Это похоже на код Python 3.3+ (.timestamp() метод) В этом случае вы можете использовать более простой код:dt.astimezone(tz=None), Также используйтеtimezone.utc вместоtimezone(datetime.timedelta()).

Похожие вопросы