python - guia - ¿Cómo ejecuto un objeto de fecha en una configuración regional diferente?
qgis manual (3)
El ejemplo dado por Rob es excelente, pero no es seguro para hilos. Aquí hay una versión que funciona con hilos:
import locale
import threading
from datetime import datetime
from contextlib import contextmanager
LOCALE_LOCK = threading.Lock()
@contextmanager
def setlocale(name):
with LOCALE_LOCK:
saved = locale.setlocale(locale.LC_ALL)
try:
yield locale.setlocale(locale.LC_ALL, name)
finally:
locale.setlocale(locale.LC_ALL, saved)
# Let''s set a non-US locale
locale.setlocale(locale.LC_ALL, ''de_DE.UTF-8'')
# Example to write a formatted English date
with setlocale(''C''):
print(datetime.now().strftime(''%a, %b'')) # e.g. => "Thu, Jun"
# Example to read a formatted English date
with setlocale(''C''):
mydate = datetime.strptime(''Thu, Jun'', ''%a, %b'')
Crea un administrador de contexto seguro para subprocesos mediante un bloqueo global y le permite tener varios subprocesos que ejecutan código dependiente de la configuración regional mediante el uso de LOCALE_LOCK. También maneja las excepciones de la declaración de rendimiento para garantizar que la configuración regional original siempre se restaure.
Tengo un objeto de fecha en Python y necesito generar una marca de tiempo en la configuración regional C para un sistema heredado, usando los códigos% a (día de la semana) y% b (mes). Sin embargo, no deseo cambiar la configuración regional de la aplicación, ya que otras partes deben respetar la configuración regional actual del usuario. ¿Hay una manera de llamar a strftime () con un determinado local?
No, no hay forma de llamar a strftime()
con una configuración regional específica.
Suponiendo que su aplicación no sea multihebra, guarde y restaure la configuración regional existente, y establezca su configuración regional en ''C''
cuando invoque strftime
.
#! /usr/bin/python3
import time
import locale
def get_c_locale_abbrev():
lc = locale.setlocale(locale.LC_TIME)
try:
locale.setlocale(locale.LC_TIME, "C")
return time.strftime("%a-%b")
finally:
locale.setlocale(locale.LC_TIME, lc)
# Let''s suppose that we''re french
locale.setlocale(locale.LC_ALL, ''fr_FR.utf8'')
# Should print french, english, then french
print(time.strftime(''%a-%b''))
print(get_c_locale_abbrev())
print(time.strftime(''%a-%b''))
Si prefieres with:
para try:
- finally:
puedes activar un administrador de contexto:
#! /usr/bin/python3
import time
import locale
import contextlib
@contextlib.contextmanager
def setlocale(*args, **kw):
saved = locale.setlocale(locale.LC_ALL)
yield locale.setlocale(*args, **kw)
locale.setlocale(locale.LC_ALL, saved)
def get_c_locale_abbrev():
with setlocale(locale.LC_TIME, "C"):
return time.strftime("%a-%b")
# Let''s suppose that we''re french
locale.setlocale(locale.LC_ALL, ''fr_FR.utf8'')
# Should print french, english, then french
print(time.strftime(''%a-%b''))
print(get_c_locale_abbrev())
print(time.strftime(''%a-%b''))
Echa un vistazo al paquete pytz
puedes usar asi
import pytz
UTC = pytz.timezone(''UTC'') # utc
fr = pytz.timezone(''Europe/Paris'') #your local
from datetime import datetime
date = datetime.now(fr)
dateUTC = date.astimezone(UTC)
strftime se representará en la zona horaria especificada
para tener el nombre del mes en el calendar uso de configuración regional, por ejemplo:
import calendar
print calendar.month_name[dateUTC.month] #will print in the locale
Inspecciona más profundamente el calendario para tener más información.