Класс date в python
Содержание:
- Модуль time
- 4 ответа
- Точность
- Структура DateTime
- Модуль time
- Для определенного часового пояса
- Работа с часовыми поясами
- Раз
- datetime.timedelta
- Форматирование даты с помощью strftime()
- Get the current Time only
- Benchmarking
- Как конвертировать временные метки в объекты DateTime, используя Strptime ()
- The strftime() Method
- Даты
- Зачем нам нужен объект timedelta?
- Структура TimeSpan
- Как рассчитать прошедшее или оставшееся время в Python
- Часовые пояса
- Сравнение значений
- Форматирование и вывод дат
Модуль time
Модуль основан на «эпохе Unix», которая началась 1 января 1970 года:
>>> import time >>> print(time.gmtime(0)) time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
Функция возвращает время в секундах по Гринвичу, начиная с эпохи Unix, как число с плавающей запятой:
>>> time.time() 1524561056.103065
Функция преобразует время, выраженное в секундах с начала эпохи Unix, в строку вида «Tue Apr 24 10:36:06 2018»:
>>> print(time.ctime()) Tue Apr 24 10:36:06 2018
Функция возвращает время по Гринвичу как объект
>>> time.gmtime() time.struct_time(tm_year=2018, tm_mon=4, tm_mday=24, tm_hour=9, tm_min=6, tm_sec=29, tm_wday=1, tm_yday=114, tm_isdst=0)
Функция возвращает местное время (с учетом часового пояса) как объект
>>> time.localtime() time.struct_time(tm_year=2018, tm_mon=4, tm_mday=24, tm_hour=12, tm_min=6, tm_sec=51, tm_wday=1, tm_yday=114, tm_isdst=0)
Свойство показывает смещение часового пояса в секундах к западу от нулевого меридиана. Если часовой пояс находится восточнее, смещение отрицательно:
>>> time.altzone -14400
Функция приостановливает выполнение скрипта на определенное количество секунд.
Свойства и методы класса
- — смещение часового пояса в секундах от нулевого меридиана.
- — возвращает текущее время в секундах по Гринвичу, прошедшее с начала эпохи Unix.
- — возвращает строкове представление переданной либо текущей даты.
- — возвращает строковое представление текущего местного времени.
- — возвращает объект , текущего или переданного времени по Гринвичу.
- — возвращает объект , текущего или переданного времени. Представляющий местное время с начала эпохи Unix.
- — преобразует кортеж или объект во время в секундах.
- — приостановить выполнение программы на заданное количество секунд.
- — преобразует кортеж или в строку по формату.
4 ответа
Лучший ответ
Чтобы сделать это максимально простым для работы, есть два шага: преобразование timedelta в int или float и сохранение его в хранилище данных. Перво-наперво, преобразование таймделты в микротайм:
Однако вам не нужно выполнять преобразование самостоятельно — вы можете определить собственное свойство хранилища данных, которое позволит вам хранить временные интервалы непосредственно в вашей модели:
Теперь вы можете использовать это свойство как любое другое:
12
Nick Johnson
10 Мар 2010 в 10:20
В конечном итоге это сработало:
В основном, необходимо получить микросекунды из временной дельты и преобразовать ее в миллисекунды.
Sologoub
10 Мар 2010 в 04:37
Если вы собираетесь хранить его как (что, я согласен, хорошая идея), я бы расширил — тогда вы получите различные биты для анализа и проверки бесплатно.
Кроме того , хранение как как может быть намного легче , чем другие методы, указанные здесь , путем сохранения его в качестве DateTime на некотором расстоянии от опорной DateTime , таким образом, что разность представляет timedelta . Это действительно легко благодаря перегрузке оператора, который дает нам модуль datetime.
Точность
в Python может обрабатывать дельты примерно +/- 2,7 миллиона лет. Тем не менее, охватывает только диапазон около 10000 лет. Чтобы сохранить большую временную дельту в дате и времени, вам придется сделать некоторые изменения и пожертвовать некоторой точностью.
Приведенный выше подход ограничивает временные интервалы до половины этого диапазона — около +/- 5000 лет из-за выбора эталонной даты и времени.
Если вы знаете, что ваша временная дельта всегда будет положительной, вы можете использовать (или, если вы знаете, что она всегда будет отрицательной, вы можете использовать ), чтобы получить полный диапазон около 10000 лет.
1
Stu Cox
20 Май 2012 в 13:25
Вам все еще нужно будет преобразовать дельту в разрешение по вашему выбору, используя атрибуты дней, минут, секунд и микросекунд дельты времени.
Brian Luft
10 Мар 2010 в 00:40
Структура DateTime
Значение DateTime определяет конкретную дату и время. Он включает Kind свойство, которое предоставляет ограниченные сведения о часовом поясе, к которому относится эта дата и время. Значение DateTimeKind , возвращаемое свойством Kind , указывает, представляет ли значение DateTime местное время (), время в формате UTC () или неопределенное время ().
DateTimeСтруктура подходит для приложений с одной или несколькими из следующих характеристик.
работают только с датами;
работают только со временем;
работают с абстрактными датами и временем;
работают с датами и временем, для которых отсутствуют сведения о часовом поясе;
работают только с датами и временем в формате UTC;
Получение сведений о дате и времени из источников за пределами .NET, таких как базы данных SQL. (как правило, информация о дате и времени хранится в этих источниках в простом формате, который совместим со структурой DateTime );
выполняют арифметические операции с датой и временем, но учитывают только общие результаты
Например, в операции сложения, которая добавляет шесть месяцев к определенным дате и времени, часто не важно, корректируется ли результат с учетом перехода на летнее время.
Кроме случая, когда определенное значение DateTime представляет время в формате UTC, значение даты и времени часто является неоднозначным или ограниченным в плане возможности переноса. Например, если значение DateTime представляет местное время, оно является переносимым внутри местного часового пояса (то есть если значение десериализуется в другой системе в том же часовом поясе, оно по-прежнему однозначно определяет конкретный момент времени). За пределами местного часового пояса значение DateTime может иметь несколько интерпретаций. Если свойство Kind имеет значение , значение даты и времени становится еще менее переносимым: в этом случае оно неоднозначно даже в том же часовом поясе и, возможно, даже на том же компьютере, на котором оно было впервые сериализовано. Значение DateTime однозначно идентифицирует момент времени независимо от времени системы или часового пояса, в котором оно используется, только если это значение представляет время в формате UTC.
Важно!
При сохранении или совместном использовании данных DateTime следует использовать формат UTC, а для свойства DateTime значения Kind должно быть задано значение .
Модуль time
Модуль time открывает разработчику Python доступ к нескольким связанным со временем функциям. Модуль основан на «эпохе», точке, с которой начинается время. Для систем Unix, эпоха началась в 1970 году. Чтобы узнать, какая эпоха в вашей системе, попробуйте запустить следующий код:
Python
import time
print(time.gmtime(0))
1 2 |
importtime print(time.gmtime()) |
Результат
Python
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=\
0, tm_wday=3, tm_yday=1, tm_isdst=0)
1 2 |
time.struct_time(tm_year=1970,tm_mon=1,tm_mday=1,tm_hour=,tm_min=,tm_sec=\ ,tm_wday=3,tm_yday=1,tm_isdst=) |
Я запустил его на Windows 7, которая также уверена в том, что начало времен датируется 1970м годом. В любом случае, в данном разделе мы ознакомимся со следующими функциями:
- time.ctime
- time.sleep
- time.strftime
- time.time
Приступим!
Для определенного часового пояса
Вы можете захотеть использовать другой часовой пояс при хранении или отображении объектов. Python дает нам удобный способ сделать это, используя модуль (Python Timezones).
Вы можете установить с помощью , если вы еще этого не сделали.
pip install pytz
Теперь мы можем использовать чтобы выбрать наш часовой пояс и передать его нашему объекту.
Вот простой пример, который печатает одно и то же время с разными часовыми поясами.
from datetime import datetime from pytz import timezone, common_timezones datetime_object = datetime.now(timezone('Asia/Kolkata')) print("Current IST:", datetime_object)
Выход
Current IST: 2020-06-27 23:27:49.003020+05:30
from datetime import datetime from pytz import timezone, common_timezones import random for _ in range(4): zone = random.choice(common_timezones) print(f"Using TimeZone: {zone}") datetime_object = datetime.now(timezone(zone)) print(datetime_object)
Выход
Using TimeZone: America/St_Lucia 2020-06-27 13:57:04.804959-04:00 Using TimeZone: Asia/Muscat 2020-06-27 21:57:04.814959+04:00 Using TimeZone: Asia/Urumqi 2020-06-27 23:57:04.825990+06:00 Using TimeZone: Asia/Seoul 2020-06-28 02:57:04.836994+09:00
Действительно, мы смогли получить текущее время в разных часовых поясах.
Работа с часовыми поясами
При работе с часовыми поясами обработка даты и времени становится более сложной. Все вышеупомянутые примеры, которые мы обсуждали, являются наивными объектами datetime, то есть эти объекты не содержат данных, связанных с часовым поясом. У объекта datetime есть одна переменная, которая содержит информацию о часовом поясе, tzinfo.
import datetime as dt dtime = dt.datetime.now() print(dtime) print(dtime.tzinfo)
Этот код напечатает:
$ python3 datetime-tzinfo-1.py 2018-06-29 22:16:36.132767 None
Вывод tzinfo – None, поскольку это объект datetime. Для преобразования часового пояса для Python доступна библиотека pytz. Теперь давайте воспользуемся библиотекой, чтобы преобразовать указанную выше метку времени в UTC.
import datetime as dt import pytz dtime = dt.datetime.now(pytz.utc) print(dtime) print(dtime.tzinfo)
Вывод:
$ python3 datetime-tzinfo-2.py 2018-06-29 17:08:00.586525+00:00 UTC
+00: 00 – разница между отображаемым временем и временем UTC. В этом примере значение tzinfo также совпадает с UTC, отсюда смещение 00:00. В этом случае объект datetime является объектом с учетом часового пояса.
Точно так же мы можем преобразовать строки даты и времени в любой другой часовой пояс. Например, мы можем преобразовать строку «2018-06-29 17: 08: 00.586525 + 00: 00» в часовой пояс «America / New_York», как показано ниже:
import datetime as dt import pytz date_time_str = '2018-06-29 17:08:00' date_time_obj = dt.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S') timezone = pytz.timezone('America/New_York') timezone_date_time_obj = timezone.localize(date_time_obj) print(timezone_date_time_obj) print(timezone_date_time_obj.tzinfo)
Выход:
$ python3 datetime-tzinfo-3.py 2018-06-29 17:08:00-04:00 America/New_York
Сначала мы преобразовали строку в объект datetime, date_time_obj. Затем мы преобразовали его в объект datetime с включенным часовым поясом, timezone_date_time_obj. Поскольку мы установили часовой пояс, как «America и New_York», время вывода показывает, что он на 4 часа отстает от времени UTC. Вы можете проверить эту страницу Википедии, чтобы найти полный список доступных часовых поясов.
Раз
Значения времени представлены классом . Экземпляр имеет атрибуты для , , и и может также включать информацию о часовом поясе.
datetime_time.py
import datetime t datetime.time(1, 2, 3) print(t) print('hour :', t.hour) print('minute :', t.minute) print('second :', t.second) print('microsecond:', t.microsecond) print('tzinfo :', t.tzinfo)
Аргументы для инициализации экземпляра необязательны, но значение по умолчанию вряд ли будет правильным.
$ python3 datetime_time.py 01:02:03 hour : 1 minute : 2 second : 3 microsecond: 0 tzinfo : None
Экземпляр содержит только значения времени, а не дату, связанную со временем.
datetime_time_minmax.py
import datetime print('Earliest :', datetime.time.min) print('Latest :', datetime.time.max) print('Resolution:', datetime.time.resolution)
Атрибуты класса и отражают допустимый диапазон времени в течение одного дня.
$ python3 datetime_time_minmax.py Earliest : 00:00:00 Latest : 23:59:59.999999 Resolution: 0:00:00.000001
Разрешение для ограничено целыми микросекундами.
datetime_time_resolution.py
import datetime for m in : try: print('{:02.1f} :'.format(m), datetime.time(0, 0, 0, microsecondm)) except TypeError as err: print('ERROR:', err)
Значения с плавающей запятой для микросекунд вызывают .
$ python3 datetime_time_resolution.py 1.0 : 00:00:00.000001 0.0 : 00:00:00 ERROR: integer argument expected, got float ERROR: integer argument expected, got float
datetime.timedelta
A object represents the difference between two dates or times.
Example 11: Difference between two dates and times
When you run the program, the output will be:
t3 = 201 days, 0:00:00 t6 = -333 days, 1:14:20 type of t3 = <class 'datetime.timedelta'> type of t6 = <class 'datetime.timedelta'>
Notice, both t3 and t6 are of type.
Example 12: Difference between two timedelta objects
When you run the program, the output will be:
t3 = 14 days, 13:55:39
Here, we have created two objects t1 and t2, and their difference is printed on the screen.
When you run the program, the output will be:
t3 = -1 day, 23:59:39 t3 = 0:00:21
Example 14: Time duration in seconds
You can get the total number of seconds in a timedelta object using method.
When you run the program, the output will be:
total seconds = 435633.233423
You can also find sum of two dates and times using operator. Also, you can multiply and divide a object by integers and floats.
Форматирование даты с помощью strftime()
from datetime import datetime # current date and time 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)
Когда вы запустите программу, результат будет примерно таким:
time: 04:34:52 s1: 12/26/2018, 04:34:52 s2: 26/12/2018, 04:34:52
Здесь % Y,% m,% d,% H и т.д. являются кодами формата. Метод strftime() принимает один или несколько кодов формата и возвращает на его основе отформатированную строку.
В приведенной выше программе t s1 и s2 -‒ это строки:
- % Y — год
- % m — месяц
- % d — день
- % H — час [00, 01, …, 22, 23
- % M — минута
- % S — секунда
Get the current Time only
Now Suppose we are just interested in current time of today. How to do that?
As datetime module provides a datetime.time class too. We can get time object from a datetime object i.e.
# Returns a datetime object containing the local date and time dateTimeObj = datetime.now() # get the time object from datetime object timeObj = dateTimeObj.time()
# Access the member variables of time object to print time information print(timeObj.hour, ':', timeObj.minute, ':', timeObj.second, '.', timeObj.microsecond) # It contains the time part of the current timestamp, we can access it's member variables to get the fields or we can directly print the object too print(timeObj)
Output:
9 : 44 : 41 . 921898 09:44:41.921898
timeStr = timeObj.strftime("%H:%M:%S.%f")
09:44:41.921898
Benchmarking
If we want a reliable benchmark of CPU-hungry function, we should be careful.
For instance, let’s measure two functions that calculate the difference between two dates: which one is faster?
Such performance measurements are often called “benchmarks”.
These two do exactly the same thing, but one of them uses an explicit to get the date in ms, and the other one relies on a date-to-number transform. Their result is always the same.
So, which one is faster?
The first idea may be to run them many times in a row and measure the time difference. For our case, functions are very simple, so we have to do it at least 100000 times.
Let’s measure:
Wow! Using is so much faster! That’s because there’s no type conversion, it is much easier for engines to optimize.
Okay, we have something. But that’s not a good benchmark yet.
Imagine that at the time of running CPU was doing something in parallel, and it was taking resources. And by the time of running that work has finished.
A pretty real scenario for a modern multi-process OS.
As a result, the first benchmark will have less CPU resources than the second. That may lead to wrong results.
For more reliable benchmarking, the whole pack of benchmarks should be rerun multiple times.
For example, like this:
Modern JavaScript engines start applying advanced optimizations only to “hot code” that executes many times (no need to optimize rarely executed things). So, in the example above, first executions are not well-optimized. We may want to add a heat-up run:
Be careful doing microbenchmarking
Modern JavaScript engines perform many optimizations. They may tweak results of “artificial tests” compared to “normal usage”, especially when we benchmark something very small, such as how an operator works, or a built-in function. So if you seriously want to understand performance, then please study how the JavaScript engine works. And then you probably won’t need microbenchmarks at all.
The great pack of articles about V8 can be found at http://mrale.ph.
Как конвертировать временные метки в объекты 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. Использование Мы передаем строку формата для управления строковым представлением даты.
The strftime() Method
The object has a method for formatting date objects into readable strings.
The method is called , and takes one parameter,
, to specify the format of the returned string:
Example
Display the name of the month:
import datetimex = datetime.datetime(2018, 6, 1)print(x.strftime(«%B»))
A reference of all the legal format codes:
Directive | Description | Example | Try it |
---|---|---|---|
%a | Weekday, short version | Wed | Try it » |
%A | Weekday, full version | Wednesday | Try it » |
%w | Weekday as a number 0-6, 0 is Sunday | 3 | Try it » |
%d | Day of month 01-31 | 31 | Try it » |
%b | Month name, short version | Dec | Try it » |
%B | Month name, full version | December | Try it » |
%m | Month as a number 01-12 | 12 | Try it » |
%y | Year, short version, without century | 18 | Try it » |
%Y | Year, full version | 2018 | Try it » |
%H | Hour 00-23 | 17 | Try it » |
%I | Hour 00-12 | 05 | Try it » |
%p | AM/PM | PM | Try it » |
%M | Minute 00-59 | 41 | Try it » |
%S | Second 00-59 | 08 | Try it » |
%f | Microsecond 000000-999999 | 548513 | Try it » |
%z | UTC offset | +0100 | |
%Z | Timezone | CST | |
%j | Day number of year 001-366 | 365 | Try it » |
%U | Week number of year, Sunday as the first day of week, 00-53 | 52 | Try it » |
%W | Week number of year, Monday as the first day of week, 00-53 | 52 | Try it » |
%c | Local version of date and time | Mon Dec 31 17:41:00 2018 | Try it » |
%C | Century | 20 | Try it » |
%x | Local version of date | 12/31/18 | Try it » |
%X | Local version of time | 17:41:00 | Try it » |
%% | A % character | % | Try it » |
%G | ISO 8601 year | 2018 | Try it » |
%u | ISO 8601 weekday (1-7) | 1 | Try it » |
%V | ISO 8601 weeknumber (01-53) | 01 | Try it » |
❮ Previous
Next ❯
Даты
Значения календарной даты представлены классом . Экземпляры имеют атрибуты для , и . С помощью метода класса легко создать дату, представляющую текущую дату.
datetime_date.py
import datetime today datetime.date.today() print(today) print('ctime :', today.ctime()) tt today.timetuple() print('tuple : tm_year =', tt.tm_year) print(' tm_mon =', tt.tm_mon) print(' tm_mday =', tt.tm_mday) print(' tm_hour =', tt.tm_hour) print(' tm_min =', tt.tm_min) print(' tm_sec =', tt.tm_sec) print(' tm_wday =', tt.tm_wday) print(' tm_yday =', tt.tm_yday) print(' tm_isdst =', tt.tm_isdst) print('ordinal:', today.toordinal()) print('Year :', today.year) print('Mon :', today.month) print('Day :', today.day)
В этом примере текущая дата выводится в нескольких форматах:
$ python3 datetime_date.py 2018-12-09 ctime : Sun Dec 9 00:00:00 2018 tuple : tm_year = 2018 tm_mon = 12 tm_mday = 9 tm_hour = 0 tm_min = 0 tm_sec = 0 tm_wday = 6 tm_yday = 343 tm_isdst = -1 ordinal: 737037 Year : 2018 Mon : 12 Day : 9
Существуют также методы класса для создания экземпляров из меток времени POSIX или целых чисел, представляющих значения дат из григорианского календаря, где 1 января года 1 равно , а каждый последующий день увеличивает значение на 1.
datetime_date_fromordinal.py
import datetime import time o 733114 print('o :', o) print('fromordinal(o) :', datetime.date.fromordinal(o)) t time.time() print('t :', t) print('fromtimestamp(t):', datetime.date.fromtimestamp(t))
В этом примере показаны различные типы значений, используемые и .
$ python3 datetime_date_fromordinal.py o : 733114 fromordinal(o) : 2008-03-13 t : 1544370390.0430489 fromtimestamp(t): 2018-12-09
Как и в случае с , диапазон поддерживаемых значений даты можно определить с помощью атрибутов и .
datetime_date_minmax.py
import datetime print('Earliest :', datetime.date.min) print('Latest :', datetime.date.max) print('Resolution:', datetime.date.resolution)
Разрешение дат – целые дни.
$ python3 datetime_date_minmax.py Earliest : 0001-01-01 Latest : 9999-12-31 Resolution: 1 day, 0:00:00
Другой способ создания новых экземпляров использует метод существующей .
datetime_date_replace.py
import datetime d1 datetime.date(2008, 3, 29) print('d1:', d1.ctime()) d2 d1.replace(year2009) print('d2:', d2.ctime())
В этом примере изменяется год, при этом день и месяц остаются неизменными.
$ python3 datetime_date_replace.py d1: Sat Mar 29 00:00:00 2008 d2: Sun Mar 29 00:00:00 2009
Зачем нам нужен объект timedelta?
При работе с датой и временем в Python вам достаточно часто придется иметь дело с модулем . В данной статье мы поговорим о том, как использовать объект модуля в Python для работы с датами. Данный объект указывает на промежуток времени и используется, когда нам нужно выполнить простые арифметические операции с объектами .
В частности, мы научимся (на примерах кода) делать следующее вещи:
- Создавать базовый объект
- Выводить текущую дату и время
- Рассчитывать дату в будущем
- Рассчитывать дату в прошлом
- Вычислять время, прошедшее с момента определенного события, или время, оставшееся до наступления определенного события.
Необходимые импорты
Прежде чем приступить к выполнению перечисленных выше задач, давайте сначала импортируем необходимые модули, как показано во фрагменте кода ниже:
# Import Necessary Modules from datetime import date from datetime import time from datetime import datetime from datetime import timedelta
Структура TimeSpan
Структура TimeSpan представляет интервал времени. Ее обычно используют двумя способами:
-
для отражения интервала времени между двумя значениями даты и времени (например, при вычитании одного значения DateTime из другого возвращается значение TimeSpan );
-
для измерения прошедшего времени. Например, Stopwatch.Elapsed свойство возвращает TimeSpan значение, отражающее интервал времени, прошедший с момента вызова одного из Stopwatch методов, которые начинают измерять прошедшее время.
TimeSpanЗначение может также использоваться в качестве замены DateTime значения, когда это значение отражает время без ссылки на конкретный день. Это использование аналогично DateTime.TimeOfDay DateTimeOffset.TimeOfDay свойствам и, возвращающим TimeSpan значение, которое представляет время без ссылки на дату. Например, структуру TimeSpan можно использовать для представления ежедневного времени открытия или закрытия магазина или времени, в которое происходит любое регулярное событие.
В примере ниже определяется структура , которая включает объекты TimeSpan , представляющие время закрытия и открытия магазина, а также объект TimeZoneInfo , представляющий часовой пояс магазина. Структура также включает два метода, и , указывающие, открыт ли магазин в то время, которое указал пользователь, предположительно находящийся в местном часовом поясе.
Затем клиентский код может использовать структуру , как показано ниже.
Как рассчитать прошедшее или оставшееся время в Python
Давайте теперь посчитаем, сколько времени осталось до Дня учителя в этом году в России отмечается 05 октября). Сделать это можно следующим образом. Чтобы вычислить с учетом сегодняшнего дня, мы можем вызвать метод объекта для получения сегодняшней даты.
Синтаксис:
teachers_day = date(time_now.year, 10, 5) today = date.today()
Затем мы можем узнать, сколько дней осталось до Дня учителя, используя следующий фрагмент кода:
time_to_td = teachers_day - today print(f"Teachers' day is {time_to_td.days} days away") # Пример вывода # Teachers' day is 105 days away
Также возможно, что в этом году День учителя пройдет к тому времени, когда вы прочтете эту статью . Если День учителя в этом году уже прошел, сделайте следующее:
- Обновите интересующую дату на дату Дня учителя в следующем году.
- Подсчитайте, сколько дней осталось до Дня Учителя в следующем году.
Это показано в следующем фрагменте кода:
if teachers_day < today: print(f"This year's Teachers' Day was {(today-teachers_day).days} days ago") teachers_day = date(time_now.year + 1, 10, 5) time_to_td = teachers_day - today print(f"Next year's Teachers' day is {time_to_td.days} days away")
Часовые пояса
В часовые пояса представлены подклассами . Поскольку является абстрактным базовым классом, приложениям необходимо определить подкласс и предоставить соответствующие реализации для нескольких методов, чтобы сделать его полезным.
включает в себя несколько наивную реализацию в классе , которая использует фиксированное смещение от UTC и не поддерживает разные значения смещения в разные дни года, например, где применяется летнее время или когда смещение от UTC со временем менялось.
datetime_timezone.py
import datetime min6 datetime.timezone(datetime.timedelta(hours6)) plus6 datetime.timezone(datetime.timedelta(hours6)) d datetime.datetime.now(min6) print(min6, ':', d) print(datetime.timezone.utc, ':', d.astimezone(datetime.timezone.utc)) print(plus6, ':', d.astimezone(plus6)) # convert to the current system timezone d_system d.astimezone() print(d_system.tzinfo, ' :', d_system)
Чтобы преобразовать значение datetime из одного часового пояса в другой, используйте . В приведенном выше примере показаны два отдельных часовых пояса, по 6 часов по обе стороны от UTC, и экземпляр из также используется для справки. Последняя строка вывода показывает значение в системном часовом поясе, полученное путем вызова без аргументов.
$ python3 datetime_timezone.py UTC-06:00 : 2018-12-09 09:46:30.709455-06:00 UTC : 2018-12-09 15:46:30.709455+00:00 UTC+06:00 : 2018-12-09 21:46:30.709455+06:00 EST : 2018-12-09 10:46:30.709455-05:00
Примечание
Сторонний модуль pytz – лучшая реализация для часовых поясов. Он поддерживает именованные часовые пояса, а база данных смещений постоянно обновляется по мере того, как политические органы по всему миру вносят изменения.
Сравнение значений
Значения даты и времени можно сравнить с помощью стандартных операторов сравнения, чтобы определить, какое из них раньше или позже.
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
Форматирование и вывод дат
Во всех браузерах, кроме IE10-, поддерживается новый стандарт Ecma 402, который добавляет специальные методы для форматирования дат.
Это делается вызовом , в котором можно задать много настроек. Он позволяет указать, какие параметры даты нужно вывести, и ряд настроек вывода, после чего интерпретатор сам сформирует строку.
Пример с почти всеми параметрами даты и русским, затем английским (США) форматированием:
Вы сможете подробно узнать о них в статье Intl: интернационализация в JavaScript, которая посвящена этому стандарту.
Методы вывода без локализации:
, ,
Возвращают стандартное строчное представление, не заданное жёстко в стандарте, а зависящее от браузера. Единственное требование к нему – читаемость человеком. Метод возвращает дату целиком, и – только дату и время соответственно.
То же самое, что , но дата в зоне UTC.
Возвращает дату в формате ISO Детали формата будут далее. Поддерживается современными браузерами, не поддерживается IE8-.
Если хочется иметь большую гибкость и кросс-браузерность, то также можно воспользоваться специальной библиотекой, например Moment.JS или написать свою функцию форматирования.