Форматирование даты в python

Содержание:

Programming With Dates and Times

If you’ve ever worked on software that needed to keep track of times across several geographic areas, then you probably have a sense of why programming with time can be such a pain. The fundamental disconnect is that computer programs prefer events that are perfectly ordered and regular, but the way in which most humans use and refer to time is highly irregular.

Note: If you want to learn more about why time can be so complicated to deal with, then there are many great resources available on the web. Here are a few good places to start:

  • Computerphile: The Problem With Time & Timezones
  • Working With Time Zones: Everything You Wish You Didn’t Need to Know
  • The Complexity of Time Data Programming

One great example of this irregularity is daylight saving time. In the United States and Canada, clocks are set forward by one hour on the second Sunday in March and set back by one hour on the first Sunday in November. However, this has only been the case since 2007. Prior to 2007, clocks were set forward on the first Sunday in April and set back on the last Sunday in October.

Things get even more complicated when you consider time zones. Ideally, time zone boundaries would follow lines of longitude exactly. However, for historical and political reasons, time zone lines are rarely straight. Often, areas that are separated by large distances find themselves in the same time zone, and adjacent areas are in different time zones. There are some time zones out there with pretty funky shapes.

Класс datetime.date

Объект представляет дату (год, месяц и день).

Пример 3: объект date для представления даты.

import datetime

d = datetime.date(2020, 6, 29) 
print(d)

Когда вы запустите программу, вывод будет следующим:

В приведенном выше примере   является конструктором класса . Конструктор принимает три аргумента: год, месяц и день.

Переменная — это объект .

Вы можете создавать объекты класса , предварительно импортировав модуль datetime, а можете импортировать только класс из модуля datetime. Вот как это делается:

from datetime import date

a = date(2020, 6, 29)
print(a) # 2020-06-29

Пример 4: Получение текущей даты.

Для получения информации о текущей дате можно воспользоваться методом .

from datetime import date

today = date.today()

print("Current date =", today)

Когда вы запустите программу, вывод будет следующим:

Пример 5: получение даты из метки времени (timestamp).

Мы также можем создавать объекты из метки времени (timestamp). Термин timestamp употребляется для обозначения POSIX-времени — количества секунд, прошедшего с 00:00:00 UTC 1 января, 1970 года. Вы можете преобразовать метку времени в дату при помощи метода .

from datetime import date

timestamp = date.fromtimestamp(1326244364)
print("Date =", timestamp)

Когда вы запустите программу, вывод будет следующим:

Пример 6: вывод текущего года, месяца и дня.

Мы легко можем получить год, месяц, день, день недели и т. д. из объекта . Вот как это делается:

from datetime import date

today = date.today() 

print("Current year:", today.year)
print("Current month:", today.month)
print("Current day:", today.day)

Когда вы запустите программу, результат будет примерно таким:

Форматирование и анализ

Строковое представление объекта datetime по умолчанию использует формат ISO-8601 (). Альтернативные форматы можно создать с помощью .

datetime_datetime_strptime.py

import datetime

format  "%a %b %d %H:%M:%S %Y"

today  datetime.datetime.today()
print('ISO     :', today)

s  today.strftime(format)
print('strftime:', s)

d  datetime.datetime.strptime(s, format)
print('strptime:', d.strftime(format))

Используйте для преобразования форматированных строк в экземпляры .

$ python3 datetime_datetime_strptime.py

ISO     : 2018-12-09 10:46:30.598115
strftime: Sun Dec 09 10:46:30 2018
strptime: Sun Dec 09 10:46:30 2018

Те же коды форматирования можно использовать с Python, поместив их после < code>: в спецификации поля строки формата.

datetime_format.py

import datetime

today  datetime.datetime.today()
print('ISO     :', today)
print('format(): {:%a %b %d %H:%M:%S %Y}'.format(today))

Каждый код формата datetime должен по-прежнему иметь префикс , а последующие двоеточия рассматриваются как буквальные символы для включения в вывод.

$ python3 datetime_format.py

ISO     : 2018-12-09 10:46:30.659964
format(): Sun Dec 09 10:46:30 2018

В следующей таблице показаны все коды форматирования для 17:00 13 января 2016 г. в часовом поясе США и Востока.

коды формата strptime/strftime

Символ

Смысл

Пример

% a

Сокращенное название дня недели

‘Мы бы’

% А

Полное название дня недели

‘Среда’

% w

Номер дня недели – от 0 (воскресенье) до 6 (суббота)

‘3’

% d

День месяца (с нулями)

’13’

% b

Сокращенное название месяца

“Ян”

% B

Полное название месяца

‘Январь’

% m

Месяц в году

’01’

% y

Год без века

’16’

% Y

Год с веком

‘2016’

%ЧАС

Час в 24-часовом формате

’17’

Час из 12-часового формата

’05’

%п

ДО ПОЛУДНЯ ПОСЛЕ ПОЛУДНЯ

‘ВЕЧЕРА’

% M

Минуты

’00’

% S

Секунды

’00’

% f

Микросекунды

“000000”

% z

Смещение UTC для объектов с учетом часовых поясов

‘-0500’

% Z

Название часового пояса

‘СТАНДАРТНОЕ ВОСТОЧНОЕ ВРЕМЯ’

% j

День года

‘013’

% W

Неделя года

’02’

% c

Представление даты и времени для текущего языкового стандарта

‘Мы бы

Янв

13

17:00:00

2016 ‘

%Икс

Представление даты для текущего языкового стандарта

’01/13/16′

%ИКС

Представление времени для текущего языкового стандарта

’17: 00: 00 ‘

%%

Буквальный

персонаж

‘%’

Как конвертировать временные метки в объекты DateTime, используя Strptime ()

Даты могут дать нам много информации, как месяц, год, день, будний день и будь то праздник или нет. Преобразует временную метку в виде строки до Объект, который дает нам много дополнительных функций. Эта функция ожидает строку и формат метки времени.

from datetime import datetime

d = datetime.strptime("21-02-2021 18:46:00", "%d-%m-%Y %H:%M:%S")

Строка 21-02-2021 18:46:00 преобразуется в подходящее Использование указанного формата. Некоторые из самых полезных директив:

  • За день месяца как от нулевой ткани, как 01, 02, 03
  • в течение месяца в качестве нулевого десятичного числа
  • За год с веком как десятичное число
  • 24 часа часы с нулевым значением часа
  • для нулевых минут, а также
  • для нулевых вспомогательных секунд.

Эта коллекция спецификаторов формата достаточно, чтобы вы начали. Для получения дополнительных вариантов вы можете просматривать, связанные с документами Отказ

Как получить текущее значение времени времени

Предположим, вы хотите хранить данные в базу данных с текущим временем времени в качестве ключа. Чтобы получить текущий момент времени, вам просто нужно 1 строку кода:

#Obtain the current timestamp

from datetime import datetime
print(datetime.now())

Как узнать, какой день это

Допустим, нам нужно знать день недели. Мы можем использовать Функция, которая возвращает числовой код на день недели, ноль через шесть, где ноль представляет в понедельник, один представляет вторник, и так далее.

Вывод может использоваться с оператором Switch для преобразования числового кода на требуемое имя дня, или вы можете использовать такой список:

Как генерировать список дат с данной даты

Допустим, мы знаем, сколько людей пиццей приказали до сегодняшнего дня, и мы заинтересованы в прогнозировании продаж пиццы на следующую неделю.

Итак, дана сегодняшняя дата, нам нужны все даты на следующую неделю для нашего необходимого анализа. Но мы не хотим беспокоиться о прыжковых годах, веках лет, и так далее. Вот один из способов сделать это.

Как работать с объектами TimeDelta

Как указано имя, Объекты представляют длительность времени между двумя датами. Допустим, у нас есть два дата, и нам нужно знать, сколько времени прошло между ними.

Объекты требуют нескольких аргументов, таких как дни, секунды, микросекунды, миллисекунды, минут, часов и недель. Значения по умолчанию для всех равны нулю. Давайте узнаем разницу в часах между 2 датами.

Что пошло не так? Не хранит ничего внутреннего, кроме дней, секунд и микросекунды, поэтому нам нужно преобразовать их, как показано ниже:

Как получить строковое представление даты от DateTime или Date Objects, используя платье

Если мы распечатаем Сам объект, дата печатается в формате ISO. Использование Мы передаем строку формата для управления строковым представлением даты.

List of the Date format codes:

Directive Meaning Example Notes
%a Weekday as locale’s abbreviated name. Sun, Mon, …, Sat (en_US);
So, Mo, …, Sa (de_DE)
(1)
%A Weekday as locale’s full name. unday, Monday, …, Saturday (en_US);
Sonntag, Montag, …, Samstag (de_DE)
(1)
%w Weekday as a decimal number, where 0 is Sunday and 6 is Saturday. 0, 1, …, 6
%d Day of the month as a zero-padded decimal number. 01, 02, …, 31 (9)
%b Month as locale’s abbreviated name. Jan, Feb, …, Dec (en_US);
Jan, Feb, …, Dez (de_DE)
(1)
%B Month as locale’s full name. January, February, …, December (en_US);
Januar, Februar, …, Dezember (de_DE)
(1)
%m Month as a zero-padded decimal number. 01, 02, …, 12 (9)
%y Year without century as a zero-padded decimal number. 00, 01, …, 99 (9)
%Y Year with century as a decimal number. 0001, 0002, …, 2013, 2014, …, 9998, 9999 (2)
%H Hour (24-hour clock) as a zero-padded decimal number. 00, 01, …, 23 (9)
%I Hour (12-hour clock) as a zero-padded decimal number. 01, 02, …, 12 (9)
%p Locale’s equivalent of either AM or PM. AM, PM (en_US);
am, pm (de_DE)
(1), (3)
%M Minute as a zero-padded decimal number. 00, 01, …, 59 (9)
%S Second as a zero-padded decimal number. 00, 01, …, 59 (4), (9)
%f Microsecond as a decimal number, zero-padded on the left. 000000, 000001, …, 999999 (5)
%z UTC offset in the form ±HHMM] (empty string if the object is naive). (empty), +0000, -0400, +1030, +063415, -030712.345216 (6)
%Z Time zone name (empty string if the object is naive). (empty), UTC, EST, CST
%j Day of the year as a zero-padded decimal number. 001, 002, …, 366 (9)
%U Week number of the year (Sunday as the first day of the week) as a zero padded decimal number. All days in a new year preceding the first Sunday are considered to be in week 0. 00, 01, …, 53 (7), (9)
%W Week number of the year (Monday as the first day of the week) as a decimal number. All days in a new year preceding the first Monday are considered to be in week 0. 00, 01, …, 53 (7), (9)
%c Locale’s appropriate date and time representation. Tue Aug 16 21:30:00 1988 (en_US);
Di 16 Aug 21:30:00 1988 (de_DE)
(1)
%x Locale’s appropriate date representation. 08/16/88 (None);
08/16/1988 (en_US);
16.08.1988 (de_DE)
(1)
%X Locale’s appropriate time representation. 21:30:00 (en_US);
21:30:00 (de_DE)
(1)
%% A literal ‘%’ character. %

Test your Python skills with w3resource’s quiz

Формат datetime

Представление даты и времени может отличатся в разных странах, организациях и т. д. В США, например, чаще всего используется формат «мм/дд/гггг», тогда как в Великобритании более распространен формат «дд/мм/гггг».

В Python для работы с форматами есть методы и .

Python strftime() — преобразование объекта datetime в строку

Метод определен в классах , и . Он создает форматированную строку из заданного объекта , или .

Пример 16: форматирование даты с использованием метода strftime().

from datetime import datetime

now = datetime.now()

t = now.strftime("%H:%M:%S")
print("time:", t)

s1 = now.strftime("%m/%d/%Y, %H:%M:%S")
# mm/dd/YY H:M:S format
print("s1:", s1)

s2 = now.strftime("%d/%m/%Y, %H:%M:%S")
# dd/mm/YY H:M:S format
print("s2:", s2)

Когда вы запустите программу, результат будет примерно таким:

Здесь , , , и т. д. — коды для определения формата. Метод принимает один или несколько кодов и возвращает отформатированную строку на его основе.

В приведенной выше программе переменные , и являются строками.

Основные коды для определения формата:

  • — год
  • — месяц
  • — день
  • — час
  • — минута
  • — секунда

Python strptime()- преобразование строки в  объект datetime

Метод создает объект datetime из заданной строки (представляющей дату и время).

Пример 17: метод strptime().

from datetime import datetime

date_string = "21 June, 2018"
print("date_string =", date_string)

date_object = datetime.strptime(date_string, "%d %B, %Y")
print("date_object =", date_object)

Когда вы запустите программу, вывод будет следующим:

Метод принимает два аргумента:

  1. строка, представляющая дату и время.
  2. формат, определяющий, каким образом части даты и времени расположены в переданной строке.

Кстати, коды , и используются для обозначения дня, месяца (название месяца в полном виде) и года соответственно.

time.sleep

Функция time.sleep дает разработчику возможность приостановить выполнение его скрипта на определенное количество секунд. Это можно сравнить с добавлением функции «Пауза» в вашу программу. Я нашел этот класс особенно полезным, когда мне нужно было подождать несколько секунд, пока закроется файл, или база данных закончит выполнять свою задачу. Давайте взглянем на пример. Откройте новое окно в IDLE и сохраните следующий код:

Python

import time

for x in range(5):
time.sleep(2)
print(«Slept for 2 seconds»)

1
2
3
4
5

importtime

forxinrange(5)

time.sleep(2)

print(«Slept for 2 seconds»)

Теперь запустите этот код в IDLE. Сделав это, вы увидите фразу «Slept for 2 seconds» пять раз, с интервалом в 2 секунды между каждым сообщением. Это очень легко в использовании!

Python TimeDelta

Объект Python TimeDelta представляет собой продолжительность времени. Мы можем создать свой объект, используя следующий заводский метод.

datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

Обратите внимание, что функция TimeDelta () принимает ключевые аргументы. Все аргументы являются необязательными и по умолчанию до 0

Аргументы могут быть целыми числами или поплавками и могут быть положительными или отрицательными.

Объект TimeDelta поддерживает математические операции, такие как добавление, вычитание, умножение и т. Д. Использование основных операторов, поэтому его очень легко использовать. Это в основном используется для получения объекта DateTime с какой-то датой и временем дельты.

Полный список кодов символов

Помимо символьных строк, приведенных выше, метод strftime принимает несколько других директив для форматирования значений даты:

  • % a: возвращает первые три символа дня недели, например среда.
  • % A: возвращает полное название дня недели, например среда.
  • % B: возвращает полное название месяца, например, сентябрь.
  • % w: возвращает день недели в виде числа от 0 до 6, при этом воскресенье – 0.
  • % m: возвращает месяц в виде числа от 01 до 12.
  • % p: возвращает AM и PM для времени.
  • % y: возвращает год в двузначном формате, то есть без века. Например, «18» вместо «2018».
  • % f: возвращает микросекунду от 000000 до 999999.
  • % Z: возвращает часовой пояс.
  • % z: возвращает смещение по всемирному координированному времени.
  • % j: возвращает номер дня в году от 001 до 366.
  • % W: возвращает номер недели в году от 00 до 53, при этом понедельник считается первым днем недели.
  • % U: возвращает номер недели в году от 00 до 53, при этом воскресенье считается первым днем каждой недели.
  • % c: возвращает местную версию даты и времени.
  • % x: возвращает локальную версию даты.
  • % X: возвращает локальную версию времени.

Рассмотрим следующий пример:

import datetime

x = datetime.datetime(2018, 9, 15)

print(x.strftime('%b/%d/%Y'))

Вывод:

Sep/15/2018

А вот как получить только месяц:

print(x.strftime('%B'))

Вывод:

September

Покажем год:

print(x.strftime('%Y'))

Вывод:

2018

В этом примере мы использовали код формата% Y

Обратите внимание, что Y находится в верхнем регистре. Теперь напишите это в нижнем регистре:

print(x.strftime('%y'))

Вывод:

18

На этот раз век опущен. Как видите, с помощью этих кодов форматирования вы можете представлять дату и время практически в любой форме.

time.ctime

Функция time.ctime конвертирует время в секунды, начиная с эпохи, в строку, показывающую местное время. Если вы ничего не передадите данной функции, то настоящее время вернется обратно. Давайте взглянем на несколько примеров:

Python

import time
print(time.ctime()) # ‘Wed Apr 5 00:02:49 2017’

print(time.ctime(1384112639)) # ‘Sun Nov 10 13:43:59 2013’

1
2
3
4

importtime

print(time.ctime())# ‘Wed Apr 5 00:02:49 2017’

print(time.ctime(1384112639))# ‘Sun Nov 10 13:43:59 2013’

В данном коде мы показали результаты вызова функции time.ctime, как со случайным набором секунд, начиная с эпохи, так и с пустным значением. Это можно применить, к примеру, в том случае, кода кому-нибудь нужно сохранить дату в секундах, начиная с эпохи, после чего конвертировать это в более удабриваемый формат. Немного проще, сохранить большое целое число (или длинное) в базу данных, чем страдать над ним, форматируя объект datetime в какой-либо объект даты, который принимает база данных. Конечно, это также имеет свой недостаток: вам, возможно, нужно будет преобразовать целое число или значение с плавающей запятой обратно в строку.

Basic datetime objects usage:

The datetime module contains three primary types of objects — date, time, and datetime.

Date:

import datetime
today = datetime.date.today()
new_year = datetime.date(2019, 1, 1)
print(new_year)

Output:

2019-01-01

Time:

import datetime
#Time object
noon = datetime.time(12, 0, 0)
print(noon)

Output:

12:00:00

Date Time:

import datetime
# Current datetime
now = datetime.datetime.now()
print(now)

Output:

2019-11-01 06:16:18.526734

Date Time:

import datetime
# Datetime object
millenium_turn = datetime.datetime(2019, 1, 1, 0, 0, 0)
print(millenium_turn)

Output:

2019-01-01 00:00:00

Обработка часового пояса в Python

Предположим, вы работаете над проектом и должны отображать дату и время в зависимости от часового пояса пользователей. Вместо того, чтобы пытаться обрабатывать часовой пояс самостоятельно, мы предлагаем вам использовать модуль pytZ.

from datetime import datetime
import pytz

local = datetime.now()
print("Local:", local.strftime("%m/%d/%Y, %H:%M:%S"))


tz_NY = pytz.timezone('America/New_York') 
datetime_NY = datetime.now(tz_NY)
print("NY:", datetime_NY.strftime("%m/%d/%Y, %H:%M:%S"))

tz_London = pytz.timezone('Europe/London')
datetime_London = datetime.now(tz_London)
print("London:", datetime_London.strftime("%m/%d/%Y, %H:%M:%S"))

Когда вы запустите программу, результат будет примерно таким:

Здесь и — это объекты , содержащие текущую дату и время соответствующего часового пояса.

Сравнение значений

Значения даты и времени можно сравнить с помощью стандартных операторов сравнения, чтобы определить, какое из них раньше или позже.

datetime_comparing.py

import datetime
import time

print('Times:')
t1  datetime.time(12, 55, 0)
print('  t1:', t1)
t2  datetime.time(13, 5, 0)
print('  t2:', t2)
print('  t1 < t2:', t1 < t2)

print()
print('Dates:')
d1  datetime.date.today()
print('  d1:', d1)
d2  datetime.date.today() + datetime.timedelta(days1)
print('  d2:', d2)
print('  d1 > d2:', d1 > d2)

Поддерживаются все операторы сравнения.

$ python3 datetime_comparing.py

Times:
  t1: 12:55:00
  t2: 13:05:00
  t1 < t2: True

Dates:
  d1: 2018-12-09
  d2: 2018-12-10
  d1 > d2: False

Açıklamalar

NowÖzelliği, DateTime yerel bilgisayardaki geçerli tarih ve saati temsil eden bir değer döndürür.The Now property returns a DateTime value that represents the current date and time on the local computer. DateTime1 Ocak 0001 gece yarısından beri geçen işaret sayısını ve bu değerin dize gösterimini temsil eden bir değer arasında bir farklılık olduğunu unutmayın. Bu, bir DateTime Tarih ve saat değerini kültüre özgü bir biçimde ifade eder.Note that there is a difference between a DateTime value, which represents the number of ticks that have elapsed since midnight of January 1, 0001, and the string representation of that DateTime value, which expresses a date and time value in a culture-specific-specific format. Tarih ve saat değerlerini biçimlendirme hakkında daha fazla bilgi için, bkz ToString . yöntemi.For information on formatting date and time values, see the ToString method. Aşağıdaki örnek, bir dizi kültüre özgü biçimdeki kısa tarih ve saat dizesini görüntüler.The following example displays the short date and time string in a number of culture-specific formats.

Bu özelliğin çözümlenmesi, temel alınan işletim sistemine bağlı olan sistem zamanlayıcıya bağlıdır.The resolution of this property depends on the system timer, which depends on the underlying operating system. 0,5 ile 15 milisaniyelik arasında bir eğilimi gösterir.It tends to be between 0.5 and 15 milliseconds. Sonuç olarak, bir Now döngü içindeki gibi kısa bir zaman aralığındaki özelliğe yinelenen çağrılar aynı değeri döndürebilir.As a result, repeated calls to the Now property in a short time interval, such as in a loop, may return the same value.

NowÖzelliği, performansı ölçmek için sık kullanılır.The Now property is frequently used to measure performance. Ancak, düşük çözünürlüğü nedeniyle, bir sınama aracı olarak kullanım için uygun değildir.However, because of its low resolution, it is not suitable for use as a benchmarking tool. Sınıfı kullanmak daha iyi bir alternatiftir Stopwatch .A better alternative is to use the Stopwatch class.

.NET Framework sürüm 2,0 ‘ den başlayarak, dönüş değeri DateTime Kind özelliğin döndürdüğü bir özelliktir .Starting with the .NET Framework version 2.0, the return value is a DateTime whose Kind property returns .

Not

DateTimeOffset.NowGeçerli yerel tarih ve saati almak için özelliğini de kullanabilirsiniz.You can also use the DateTimeOffset.Now property to retrieve the current local date and time. Yerel bir saatin zaman içinde tek bir nokta olarak ifade etmesine olanak tanır, bu da bu saat değerini bilgisayarlar arasında taşınabilir hale getirir.It allows a local time to be expressed unambiguously as a single point in time, which in turn makes that time value portable across computers.

Зачем нам нужен объект timedelta?

При работе с датой и временем в Python вам достаточно часто придется иметь дело с модулем . В данной статье мы поговорим о том, как использовать объект модуля в Python для работы с датами. Данный объект указывает на промежуток времени и используется, когда нам нужно выполнить простые арифметические операции с объектами .

В частности, мы научимся (на примерах кода) делать следующее вещи:

  1. Создавать базовый объект
  2. Выводить текущую дату и время
  3. Рассчитывать дату в будущем
  4. Рассчитывать дату в прошлом
  5. Вычислять время, прошедшее с момента определенного события, или время, оставшееся до наступления определенного события.

Необходимые импорты

Прежде чем приступить к выполнению перечисленных выше задач, давайте сначала импортируем необходимые модули, как показано во фрагменте кода ниже:

# Import Necessary Modules
from datetime import date
from datetime import time
from datetime import datetime
from datetime import timedelta

Разница между двумя датами и временем

from datetime import datetime, date

t1 = date(year = 2018, month = 7, day = 12)
t2 = date(year = 2017, month = 12, day = 23)
t3 = t1 - t2
print("t3 =", t3)

t4 = datetime(year = 2018, month = 7, day = 12, hour = 7, minute = 9, second = 33)
t5 = datetime(year = 2019, month = 6, day = 10, hour = 5, minute = 55, second = 13)
t6 = t4 - t5
print("t6 =", t6)

print("type of t3 =", type(t3)) 
print("type of t6 =", type(t6))  

Когда вы запустите программу, вывод будет:

t3 = 201 days, 0:00:00
t6 = -333 days, 1:14:20
type of t3 = <class 'datetime.timedelta'>
type of t6 = <class 'datetime.timedelta'>

Обратите внимание, что и t3, и t6 относятся к типу

Improving Your PyCon Countdown

Now that you know how to add time zone information to a Python instance, you can improve your PyCon countdown code. Earlier, you used the standard constructor to pass the year, month, day, and hour that PyCon will start. You can update your code to use the module, which provides a more natural interface for creating instances:

In this code, you import and from and from . Next, you use to read the date of the next PyCon US from a string. This is much more readable than the plain constructor.

returns a naive instance, so you use to change the to the time zone. PyCon US 2021 will take place in Pittsburgh, Pennsylvania, which is in the US Eastern time zone. The canonical name for that time zone is since New York City is the largest city in the time zone.

is an aware instance with the time zone set to US Eastern time. Since May 12 is after daylight saving time takes effect, the time zone name is , or .

Conclusion

In this tutorial, you learned about programming with dates and times and why it often leads to errors and confusion. You also learned about the Python and modules as well as how to work with time zones in your code.

Now you can:

  • Store dates in a good, future-proof format in your programs
  • Create Python instances with formatted strings
  • Add time zone information to instances with
  • Perform arithmetic operations with instances using

In the end, you created a script that counts down the time remaining until the next PyCon US so you can get excited for the biggest Python gathering around. Dates and times can be tricky, but with these Python tools in your arsenal, you’re ready to tackle the toughest problems!

Модуль datetime

Модуль содержит классы:

Также существует класс , который применяется для работы с часовыми поясами.

Класс datetime.date

Класс принимает три аргумента: год, месяц и день.

>>> import datetime
>>> date = datetime.date(2017, 4, 2)
>>> date.year
2017
>>> date.month
4
>>> date.day
2

Давайте посмотрим, какой сейчас день:

>>> today = datetime.date.today()
>>> today.year
2018
>>> today.month
4
>>> today.day
21

Класс datetime.datetime

Класс принимает аргументы: год, месяц, день, час, минута, секунда и микросекунда.

>>> date_time = datetime.datetime(2017, 4, 21, 13, 30, 10)
>>> date_time.year
2017
>>> date_time.month
4
>>> date_time.day
21
>>> date_time.hour
13
>>> date_time.minute
30
>>> date_time.second
10

Давайте посмотрим, какое сейчас время:

>>> today = datetime.datetime.today()
>>> today
datetime.datetime(2018, 4, 21, 12, 43, 27, 786725)
>>> today.hour
12
>>> today.minute
43
>>> datetime.datetime.now() # местное время
datetime.datetime(2018, 4, 24, 13, 2, 39, 17479)
>>> datetime.datetime.utcnow() # время по Гринвичу
datetime.datetime(2018, 4, 24, 10, 2, 47, 46330)

Получить из объекта отдельно дату и отдельно время:

>>> today = datetime.datetime.today()
>>> today
datetime.datetime(2018, 4, 21, 13, 26, 54, 387462)
>>> today.date() # отдельно дата
datetime.date(2018, 4, 21)
>>> today.time() # отдельно время
datetime.time(13, 26, 54, 387462)

Классы и содержат метод , который позволяет создавать строку, отображающую время в более понятной для человека форме.

>>> today = datetime.date.today().strftime("%d.%m.%Y")
>>> today
'21.04.2018'
>>> import locale
>>> locale.setlocale(locale.LC_ALL, "ru") # задаем локаль для вывода даты на русском языке
'ru'
>>> today = datetime.datetime.today().strftime("%A, %d.%m.%Y")
>>> today
'суббота, 21.04.2018'
Сокращенное название дня недели
Полное название дня недели
Сокращенное название месяца
Полное название месяца
Дата и время
День месяца
24-часовой формат часа
12-часовой формат часа
День года. Цифровой формат
Номер месяца. Цифровой формат
Минута. Цифровой формат
До полудня или после (AM или PM)
Секунда. Цифровой формат
Номер недели в году. Цифровой формат (с воскресенья)
День недели. Цифровой формат
Номер недели в году. Цифровой формат (с понедельника)
Дата
Время
Год без века. Цифровой формат
Год с веком. Цифровой формат
Временная зона
Знак процента

Методы класса :

  • — объект из текущей даты и времени; работает также, как и со значением .
  • — объект из текущей даты и времени, местное время.
  • — объект из текущей даты и времени, по Гринвичу.
  • — дата из стандартного представления времени.
  • — дата из числа, представляющего собой количество дней, прошедших с 01.01.1970.
  • — объект из комбинации объектов и .
  • — преобразует строку в (так же, как и функция из модуля ).
  • — преобразует объект в строку согласно формату.
  • — объект даты (с отсечением времени).
  • — объект времени (с отсечением даты).
  • — возвращает новый объект с изменёнными атрибутами.
  • — возвращает из .
  • — количество дней, прошедших с 01.01.1970.
  • — возвращает время в секундах с начала эпохи Unix.
  • — день недели в виде числа, понедельник — 0, воскресенье — 6.
  • — день недели в виде числа, понедельник — 1, воскресенье — 7.
  • — кортеж (год в формате ISO, ISO номер недели, ISO день недели).
  • — красивая строка вида или, если ,
  • — возвращает строковое представление текущего местного времени.

Класс datetime.timedelta

Класс позволяет выполнять операции над датами — складывать, вычитать, сравнивать. Конструктор принимает именованные аргументы , , , , , , :

>>> delta = datetime.timedelta(days = 5, hours = 1, minutes = 1)
>>> delta
datetime.timedelta(5, 3660)

Интервал времени 5 дней, 1 час и 1 минута. Получить результат можно с помощью атрибутов , и (5 дней и 3660 секунд):

>>> delta.days
5
>>> delta.seconds
3660

Получить результат в секундах позволяет метод :

>>> today = datetime.datetime.today() # текущая дата
>>> today
datetime.datetime(2018, 4, 21, 15, 19, 2, 515432)
>>> future = datetime.datetime(2019, 4, 21, 15, 19, 2, 515432) # дата на один год больше
>>> delta = future - today
>>> delta
datetime.timedelta(365)
>>> delta.total_seconds() # 365 дней в секундах
31536000.0

Прибавить к текущей дате 10 дней, 10 часов и 10 минут:

>>> today = datetime.datetime.today()
>>> delta = datetime.timedelta(days = 10, hours = 10, minutes = 10)
>>> future = today + delta
>>> today # 21 апреля 2018 года, 15:29
datetime.datetime(2018, 4, 21, 15, 29, 29, 265954)
>>> future # 2 мая 2018 года, 01:39
datetime.datetime(2018, 5, 2, 1, 39, 29, 265954)

Работа с часовыми поясами

К сожалению у меня нет большого опыта работы с часовыми поясами и примеры ниже не стоит рассматривать как лучшие практики. 

Библиотека datetime не хранит часовые пояса, данные о переводах часов (летнее и зимнее время) и високосных секундах. К тому же, некоторые страны, могут изменить время опираясь на локальные ситуации. Эти ситуации опасны, когда идет запись в базу данных. Для вывода в GUI, можно использовать datetime.datetime.now() или высчитывать часовой пояс из базы.

Для записи в базу данных мы можем использовать время UTC и отдельно считать часовой пояс:

Следующий пример вычислит разницу времени между UTC и локальным. Насколько я знаю он может не сработать на версиях Python < 3.3:

Для вычисления других часовых поясов можно использовать стороннюю библиотеку pytz, которая их хранит:

 Вывести все часовые пояса мы можем так:

На примере ниже я перевожу локальное время в часовой пояс Киева:

Рекомендую

Форматирование и вывод дат

Во всех браузерах, кроме IE10-, поддерживается новый стандарт Ecma 402, который добавляет специальные методы для форматирования дат.

Это делается вызовом , в котором можно задать много настроек. Он позволяет указать, какие параметры даты нужно вывести, и ряд настроек вывода, после чего интерпретатор сам сформирует строку.

Пример с почти всеми параметрами даты и русским, затем английским (США) форматированием:

Вы сможете подробно узнать о них в статье Intl: интернационализация в JavaScript, которая посвящена этому стандарту.

Методы вывода без локализации:

, ,
Возвращают стандартное строчное представление, не заданное жёстко в стандарте, а зависящее от браузера. Единственное требование к нему – читаемость человеком. Метод возвращает дату целиком, и – только дату и время соответственно.

То же самое, что , но дата в зоне UTC.

Возвращает дату в формате ISO Детали формата будут далее. Поддерживается современными браузерами, не поддерживается IE8-.

Если хочется иметь большую гибкость и кросс-браузерность, то также можно воспользоваться специальной библиотекой, например Moment.JS или написать свою функцию форматирования.

Заключение

В этой статье мы показали различные способы синтаксического анализа строки в объект datetime в Python. Вы можете выбрать библиотеку datetime в Python по умолчанию или любую из сторонних библиотек, упомянутых в этой статье, среди многих других.

Основная проблема с пакетом datetime по умолчанию заключается в том, что нам нужно вручную указать код синтаксического анализа почти для всех форматов строк даты и времени. Итак, если ваш строковый формат изменится в будущем, вам, вероятно, также придется изменить свой код. Но многие сторонние библиотеки, такие как упомянутые здесь, обрабатывают это автоматически.

Еще одна проблема, с которой мы сталкиваемся, – это часовые пояса. Лучший способ справиться с ними – всегда сохранять время в базе данных в формате UTC, а затем при необходимости преобразовывать его в местный часовой пояс пользователя.

Эти библиотеки не только хороши для синтаксического анализа строк, но их можно использовать для множества различных типов операций, связанных с датой и временем.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector