Mam obiekt daty w python i potrzebuję wygenerować znacznik czasu w locale C dla starszego systemu, używając kodów% a (weekday) i% b (month). Nie chcę jednak zmieniać ustawień narodowych aplikacji, ponieważ inne części muszą respektować bieżące ustawienia narodowe użytkownika. Czy istnieje sposób wywołania strftime() z określonym locale?Jak utworzyć strftime obiektu daty w innym języku?
Odpowiedz
Przykład podany przez Roba jest super, ale nie jest threadsafe. Oto wersja, która współpracuje z wątków:
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')
Tworzy menedżera kontekstowe threadsafe przy użyciu globalnej blokady i pozwala mieć wiele wątków uruchomionych lokalizacji zależnej od kodu za pomocą LOCALE_LOCK. Obsługuje również wyjątki od deklaracji zysku, aby zapewnić, że oryginalne ustawienia narodowe są zawsze przywracane.
spojrzeć na pytz package
można używać jak to
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 odda w strefie czasowej określonej
dla mieć nazwę miesiąca w korzystaniu locale calendar na przykład:
import calendar
print calendar.month_name[dateUTC.month] #will print in the locale
inspekcja mo ponownie głęboko w kalendarzu, aby uzyskać więcej informacji
To interesujące, ale muszę wygenerować datownik z angielskimi słowami na dni powszednie (% a) i miesiące (% b), nie zmieniać strefy czasowej. Czy Python może to zrobić? – MagerValp
spójrz na kalendarz http://docs.python.org/2/library/calendar.html#module-calendar i metoda calendar.month_name prawdopodobnie –
Ponownie, nie jest to, co chce OP. 'calendar.month_name' Tablica reprezentująca miesiące roku w bieżącym locale. –
Nie, nie ma sposobu, aby zadzwonić pod numer strftime()
z określonymi ustawieniami regionalnymi.
Zakładając, że twoja aplikacja nie jest wielowątkowa, zapisz i przywróć istniejące ustawienia narodowe i ustaw język na 'C'
po wywołaniu 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'))
Jeśli wolisz with:
do try:
- finally:
, można wzbudzać menedżera kontekstowego:
#! /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'))
to ustawienie narodowe we wszystkich skryptach uważam więc bądź ostrożny –
Tak, 'locale.setlocale()' wpływa na cały program. Blok 'try-finally' lub' with' ustawia i przywraca ustawienia narodowe, aby nie zakłócać reszty programu. –
- 1. Django GROUP BY format daty strftime
- 2. Złe kodowanie podczas korzystania z strftime w języku hiszpańskim?
- 3. Jak utworzyć niestandardową składnię do opisu obiektu w języku C#?
- 4. Jak utworzyć tabelę SQL w innym schemacie?
- 5. Jak ustawić strefę czasową przed wywołaniem strftime?
- 6. Jak utworzyć tabelę przestawną w języku VBA
- 7. Formatowanie daty w języku ClosedXML
- 8. Jak sformatować ciąg daty w języku Java?
- 9. Jak utworzyć format daty, taki jak "1 listopada" w C#
- 10. Jak utworzyć względne/przybliżone daty w Perlu?
- 11. Jak uzyskać wszystkie daty w danym miesiącu w języku C#
- 12. Konwertuj strtotime() na StrFTime()
- 13. Jak utworzyć procedurę CLR w języku C#, która zostanie wdrożona w schemacie innym niż DBO
- 14. Porównanie obiektu daty JavaScript
- 15. TypeError: deskryptor "strftime" wymaga obiektu "datetime.date", ale otrzymał "Tekst"
- 16. Jak rozumieć strptime vs. strftime
- 17. Czy można kodować java w innym języku?
- 18. utworzyć plik w innym katalogu z php
- 19. Jak utworzyć niestandardowe formanty w języku C#?
- 20. Jak utworzyć wskaźnik w języku C#?
- 21. Jak utworzyć klawiaturę ekranową w języku Java?
- 22. Jak utworzyć adnotację niestandardową w języku Java?
- 23. Jak utworzyć formularz "unfocusable" w języku C#?
- 24. Jak utworzyć żądanie PATCH w języku Python?
- 25. Konwertowanie daty daty ISO 8601 na sekundy w języku Python
- 26. Jak utworzyć ArrayList obiektu w szybkim
- 27. Jak utworzyć instancję obiektu DataContext w XAML
- 28. Nie wyściółka godzinami w strftime
- 29. Formatowanie daty regionalnej w języku Python
- 30. php strftime Francuskie znaki
Należy pamiętać, że aby funkcja setlocale() powiodła się, potrzebne są ustawienia narodowe zainstalowane na poziomie systemu. Zasadniczo nie można na niej polegać. Cokolwiek oznacza lokalizację, musisz trzymać się z dala od strftime i używać odpowiedniej biblioteki i18n, takiej jak Babel. – ddaa
jest to literówka na 'saved = locale.setlocale (...'? – vonPetrushev
Nie wierzę, że istnieje literówka - jeśli drugim argumentem dla setlocale jest None, otrzymasz aktualnie ustawione ustawienia regionalne. – Daniel