время дата дата и время метка времени

Python MySQL

предисловие

Формат времени является неизбежным знанием для любого инженера, и то же самое верно для инженеров-краулеров. Инженерам краулеров необходимо хранить контент одного типа с разных веб-сайтов в одной таблице данных.

* 站点 A 的时间格式为 “2018-5”
* 站点 B 的时间格式为 “3天前”
* 站点 C 的时间格式为 “5-10 8:25”

Какой формат времени следует использовать при сохранении в базе данных? При создании нового поля вы выбираете формат DATE или формат DATETIME? Что такое ГОД?

Встроенные функции времени Python включают время и дату/время Когда уместно использовать время? Когда выбирать дату и время?

Тип времени Mysql

При создании таблицы базы данных обычно есть 5 типов полей, из которых люди могут выбирать:ВРЕМЯ, ДАТА, ДАТАВРЕМЯ, ОТМЕТКА ВРЕМЕНИ, ГОД.

Форматы памяти и времени для каждого типа следующие:

- TIME类型 :存储空间[3 bytes] - 时间格式[HH:MM:SS] - 时间范围[-838:59:59  到  ~ 838:59:59]
- DATE类型 :存储空间[3 bytes] - 时间格式[YYYY-MM-DD] - 时间范围[1000-01-01 到 9999-12-31] (可以理解为年月日)
- DATETIME类型 :存储空间[8 bytes] - 时间格式[YYYY-MM-DD HH:MM:SS] - 时间范围[1000-01-01 00:00:00 到 9999-12-31 23:59:59] (可以理解为年月日时分秒)
- TIMESTAMP类型 :存储空间[4 bytes] - 时间格式[YYYY-MM-DD HH:MM:SS] - 时间范围[1970-01-01 00:00:01 到 2038-01-19  03:14:07] (以秒为计算)
- YEAR类型 :存储空间[1 bytes] - 时间格式[YYYY] - 时间范围[1901  到  2155](按年计算)

Форматы времени, такие как YEAR, используются реже, а TIME используется редко.Обычными являются DATE, DATETIME и отметка времени TIMESTAMP.

время питона

Python предоставляет три функции времени: модуль времени time, базовый модуль времени и даты datetime и модуль календаря Calendar. В модуле времени Python есть много функций для преобразования распространенных форматов даты. Например, функция time.time() используется для получения текущей метки времени:

import time

timestamp = time.time()
print(timestamp, type(timestamp))

Выходная метка времени имеет тип float:

1544788687.041193 <class 'float'>

Единицы меток времени лучше всего подходят для арифметики даты. Но даты до 1970 года не могут быть представлены таким образом. Не так уж и далеко, UNIX и Windows поддерживают только до 2038 года. Модуль Time содержит следующие встроенные функции как для обработки времени, так и для преобразования форматов времени:

Календарь для Python

Функции календаря связаны с календарем, понедельник — первый день недели по умолчанию, воскресенье — последний день недели по умолчанию. Чтобы изменить настройку, вызовите функцию calendar.setfirstweekday(). Модуль содержит следующие встроенные функции:

Модуль календаря Календарь используется нечасто (менее практичные приложения, разработанные в краулерах и Django). Наиболее распространенными являются модуль time и модуль dateteime. Какая связь между временем и датой?

- time模块  --  比较接近底层的
- datetime模块  --  基于time新增了很过功能,提供了更多函数

использовать контраст

1. Получить текущее время

import datetime, time

""" 崔庆才丨静觅、韦世东丨奎因 邀你关注微信公众号【进击的Coder】 """
print(time.time())
print(datetime.datetime.now())

В результате получается:

1544789253.025471
2018-12-14 20:07:33.025502

2. Отформатируйте текущее время

import datetime, time

""" 崔庆才丨静觅、韦世东丨奎因 邀你关注微信公众号【进击的Coder】 """
""" time当前时间 """
localtime = time.localtime(time.time())
print("当前时间元组 :", localtime)
print("不格式化:", time.time())
res1 = time.strftime('%Y-%m-%d', localtime)
print("strftime 可以把时间格式化为日期形式 :", res1)
res2 = time.strftime('%Y-%m-%d %H:%M:%S', localtime)
print("strftime 可以把时间转换为日期和时间 :", res2)
# ------------------------------------------------
""" datetime当前时间 """
time_now = datetime.datetime.now()
res3 = datetime.datetime.now().strftime("%Y-%m-%d")
res4 = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print("不格式化的当前时间:", time_now)
print("datetime 也可以这样用:", res3)
print("datetime 也可以这样用:", res4)

Полученный результат:

当前时间元组 : time.struct_time(tm_year=2018, tm_mon=12, tm_mday=14, tm_hour=20, tm_min=18, tm_sec=11, tm_wday=4, tm_yday=348, tm_isdst=0)
不格式化: 1544789891.681039
strftime 可以把时间格式化为日期形式 : 2018-12-14
strftime 可以把时间转换为日期和时间 : 2018-12-14 20:18:11
不格式化的当前时间: 2018-12-14 20:18:11.681079
datetime 也可以这样用: 2018-12-14
datetime 也可以这样用: 2018-12-14 20:18:11

Здесь видно, что время, полученное этими двумя модулями, нелегко прочитать людям, и оба должны быть отформатированы функцией strftime.

3. Преобразование времени текста

Здесь я имею в виду время других веб-сайтов, полученных поисковым роботом, обычно в нескольких форматах:

  • Давно -- 06.01.2018 18:35:05, 06.01.2018 18:35
  • Дата -- 06.01.2018
  • Месяц Время -- 2018-01
  • Время -- 18:35:05

Время, полученное краулером, считывается человеком, но разделитель другой. При складировании инженеры-краулеры надеются, что их формат времени унифицирован, год месяц день час минута секунда или год месяц день, если возможно, используйте отметку времени для облегчения расчета (год месяц день час минута секунда соответствует году месяц день час минута секунда, год месяц и день нельзя напрямую преобразовать в год, месяц, день, час, минуту, секунду).

При встрече с форматом времени типа даты 2018-01-06 невозможно использовать функцию для прямого преобразования формата длительного времени (например, 2018-01-06 18:35:05), а принудительное операция сообщит об ошибке. При возникновении такой ситуации, когда необходимо унифицировать формат времени, прямого метода работы нет, а время можно только преобразовать. Преобразование делится на два типа: преобразование одного формата времени и преобразование другого формата времени:

первый случай

Цель: 2018-01-06 18:35:05 преобразовано в 2018/01/06 18:35:05

У него есть два способа удовлетворить

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

import datetime,time

a = "2013-10-10 23:40:00"  # 想要转换成 a = "2013/10/10 23:40:00"

timeArray = time.strptime(a, "%Y-%m-%d %H:%M:%S")
otherStyleTime = time.strftime("%Y/%m/%d %H:%M:%S", timeArray)
print(timeArray)
print(otherStyleTime)

Из выходного результата:

time.struct_time(tm_year=2013, tm_mon=10, tm_mday=10, tm_hour=23, tm_min=40, tm_sec=0, tm_wday=3, tm_yday=283, tm_isdst=-1)
2013/10/10 23:40:00

Как видите, сначала преобразуйте его в массив времени через time.strptime, а затем отформатируйте массив времени в нужный мне формат через time.strftime.

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

a = "2013-10-10 23:40:00"  # 想要转换成 a = "2013/10/10 23:40:00"

print(a.replace("-", "/"))

Результат:

2013/10/10 23:40:00

второй случай

Цель: 2018-01-06 преобразовано в 2018-01-06 18:35:05

У него также есть два способа удовлетворить

Его логика состоит в том, чтобы объединить строки года, месяца и дня с часами, минутами и секундами, а затем преобразовать их в соответствии с двумя вышеуказанными методами, например:

a = "2013-10-10 "  # 想要转换成 a = "2013/10/10 23:40:00"
ac = a + "00:00:00"
print(ac.replace("-", "/"))

получить вывод

2013/10/10 00:00:00

Третья ситуация

Цель: 2018-01-06 18:35:05 преобразовано в 2018-01-06

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

import datetime,time

a = "2013-10-10 23:40:00"  # 想要转换成 a = "2013/10/10"
timeArray = time.strptime(a, "%Y-%m-%d %H:%M:%S")
otherStyleTime = time.strftime("%Y/%m/%d", timeArray)
print(type(timeArray))
print(otherStyleTime)

В результате получается (вы можете видеть, что тип timeArray — time.struct_time):

<class 'time.struct_time'>
2013/10/10

4. Операция сравнения времени

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

Первое, формат времени тот же

import datetime,time

d1 = datetime.datetime.strptime('2012-03-05 17:41:20', '%Y-%m-%d %H:%M:%S')
d2 = datetime.datetime.strptime('2012-03-05 16:41:20', '%Y-%m-%d %H:%M:%S')
delta = d1 - d2
print(type(d1))
print(delta.seconds)
print(delta)

В результате получается:

<class 'datetime.datetime'>
3600
1:00:00

Как видно из результатов, два времени с одним и тем же форматом могут быть преобразованы, а затем рассчитаны по datetime.datetime.strptime, а также могут быть рассчитаны по .секундам в результате.разница в секундахи по .days для расчетаразница в днях

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

import datetime,time

d1 = datetime.datetime.strptime('2012/03/05 17:41:20', '%Y/%m/%d %H:%M:%S')

d2 = datetime.datetime.strptime('2012-03-05 16:41:20', '%Y-%m-%d %H:%M:%S')
delta = d1 - d2
print(delta.seconds)
print(delta)

Строковая форма времени в этом коде другая, но ее можно сравнить и вычислить после преобразования через ту же функцию.

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

import datetime,time

d1 = datetime.datetime.strptime('2012/03/05 17:41:20', '%Y/%m/%d %H:%M:%S')
d2 = datetime.datetime.strptime('2012-03-01', '%Y-%m-%d')
delta = d1 - d2
print(delta.days,delta.seconds)
print(delta)
print(type(delta))

Выход

4 63680
4 days, 17:41:20
<class 'datetime.timedelta'>

Несколько частей информации могут быть получены из результата печати: Время в разных форматах можно сравнивать после преобразования Дни и часы, минуты и секунды могут отображаться через .days и .seconds Тип данных, полученный после расчета, — «datetime.timedelta» вместо типа str.

Например, чтобы рассчитать время через 3 дня:

import datetime,time

now = datetime.datetime.now()
delta = datetime.timedelta(days=3)
n_days = now + delta
print(type(n_days))
print(n_days.strftime('%Y-%m-%d %H:%M:%S'))

Полученный результат:

<class 'datetime.datetime'>
2018-01-21 10:26:14

Используйте datetime.timedelta, чтобы получить 3 дня времени, затем добавьте 3 дня к текущему времени и получите данные типа «datetime.datetime», которые необходимо отформатировать с помощью функции strftime, чтобы они стали форматом для человеческого чтения, и, наконец, получите желаемое 2018-01-21 10:26:14.


5. Отметка времени

Преобразование строкового времени в метку времени:

import datetime,time

a = "2013-10-10 23:40:00"
# 转换为时间数组
timeArray = time.strptime(a, "%Y-%m-%d %H:%M:%S")
# 转换为时间戳:
timeStamp = time.mktime(timeArray)
print(timeArray)
print(timeStamp)

Результат:

time.struct_time(tm_year=2013, tm_mon=10, tm_mday=10, tm_hour=23, tm_min=40, tm_sec=0, tm_wday=3, tm_yday=283, tm_isdst=-1)
1381419600.0

Вы можете видеть, что временной массив времени - это не то же самое, что и временная метка, они разные.


6. strftime и strptime

Эти два обычно используются в python

функция strftime:

  • Функция принимает кортеж времени и возвращает местное время в виде удобочитаемой строки в формате, определяемом форматом параметра.
  • time.strftime(format[, t])
  • формат – строка формата. t — необязательный аргумент t — это объект struct_time.
  • Возвращает местное время в виде читаемой строки.
import time

t = (2009, 2, 17, 17, 3, 38, 1, 48, 0)
t = time.mktime(t)
print(time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(t)))

чтобы получить результирующий вывод:

2009-02-17 09:03:38

стрпвремя() Функция анализирует строку времени в кортеж времени в соответствии с указанным форматом. time.strptime (строка [ формат]) строка – строка времени. формат – строка формата. Возвращает объект struct_time.

import datetime,time

d1 = datetime.datetime.strptime('20120305 17:41:20', '%Y%m%d %H:%M:%S')
d2 = datetime.datetime.strptime('2012-03-01', '%Y-%m-%d')
print(d1)
print(d2)

получил ответ:

2012-03-05 17:41:20
2012-03-01 00:00:00

Формат времени и хранение

Столько всего было заложено впереди, а конечную цель еще нужно положить на хранение. Вот четыре типа времени базы данных в качестве примеров:

  • имя поля => тип данных
  • r_time => time
  • r_date => date
  • r_datetime => datetime
  • r_timestamp => timestamp

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

  • формат времени => тип данных
  • 17:35:05 => time
  • 2018-3-1 => date
  • 2018/3/1 17:35 => datetime
  • 2018/3/1 17:35 => timestamp

тип времени

Формат временного типа указывается как 17:35:05, который не может быть заменен (17-35-05 или 17/35/05), и будет сообщена ошибка

Его можно сократить как 17:35, база данных автоматически заполнит следующие 00, а окончательные данные после сохранения — 17:35:00.

Если его сократить до 17, то после сохранения оно становится 00:00:17.

Конечно, если будет написано более причудливым образом 17:,17:35: Это выдаст ошибку


тип даты

Формат типа даты указан как 2018-3-1 и 2018/3/1, а окончательный формат хранения (2018-03-01), который будет автоматически заполнен

Его можно сократить как [18/3/1], [17/3/1], [07/3/1], [97/3/1], база данных автоматически заполнит предыдущий год, а окончательные данные после хранения 01.03.2018, 01.03.2017, 01.03.2007, 01.03.1997

Нельзя сокращать как [2017], [2017/3], будет сообщено об ошибке, это должен быть полный формат даты


тип даты и времени

Формат типа datetime указан как 2018-3-1 17:35:00 и 2018/3/1 17:35:00, а окончательный формат хранения — 2018-03-01 17:35:00.

Это комбинация даты и времени и имеет много общих черт.

Можно сократить как [18/3/1 17:35:05], [17/3/1 17:35], [07/3/1 17], [97/3/1 17], база данных будет автоматически заполняется Предыдущий год, окончательные данные после сохранения :00 :00. Вы можете видеть, что он автоматически завершает формат времени в унифицированный формат.Разница здесь в том, что если вы пишете только 17 без записи минут и секунд, время по умолчанию будет рассматривать 17 как секунды, а здесь по умолчанию часы.

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


тип метки времени

Согласно приведенному выше описанию, формат хранения метки времени такой же, как и у даты и времени. Разница заключается в диапазоне времени и пространстве для хранения. Его формат и использование соответствуют дате и времени.

Увидев это, я считаю, что у вас есть много вопросов, которые вы можете задать, вы можете оставить сообщение в области комментариев ниже, чтобы обсудить