<jupyter_start><jupyter_text>Source: https://medium.com/techtofreedom/5-levels-of-handling-date-and-time-in-python-46b601e47f65 对于软件开发处理日期和时间都是基本的需要。由于日期和时间是一种特殊的数据类型，有时一些操作是令人困惑，且易犯错误的。例如不同的数据格式或者时间区域的转换许多编程工作者虽然工作了很多年，但是他们还是会遇到关于日期和时间的操作问题，这就是为什么本文必须要看的原因。这篇文章主要由易变难的解释了5种日期和时间的操作函数，在阅读完后，在python中处理日期和时间将对你是小菜一碟。  Level 0: Know the Basic 3 Objects in Datetime Module 在Python中所有与时间相关的对象都可以被这三个基础的`Datetime`模具构建，他们分别是：- datetime: 可以处理 year-month-day-hour-minute-second信息的对象- date: 可以用来处理 year-month-day信息的对象- time: 可以用来处理 hour-minute-second 信息的对象    让我们使用他们看看下面具体的例子：  获取目前的时间信息 我们可以类方法获取今天的时间或者日期，这是不用实例化时间或者日期对象<jupyter_code>from datetime import datetime
from datetime import date

print(datetime.now())
print(date.today())<jupyter_output><empty_output><jupyter_text>构建和处理对象 我们可以通过这三个模具构建具体的例子，根据具体的需求使用他们，下面的例子将解释 `date`例子，`datetime` 和 `time` 的例子是类似的。<jupyter_code>from datetime import date

today = date(2021,11,15)

print(today.year)
print(today.month)
print(today.day)
print('\n')
print(today.weekday())

new_date = today.replace(year=2035)
print(today)
print(new_date)<jupyter_output>2021
11
15


0
2021-11-15
2035-11-15<jupyter_text>Level 1: Be Familiar with Time Calculations 多亏了 `timedelta` 类， 在Python中计算时间是如此简单。<jupyter_code>from datetime import datetime, timedelta

now = datetime.now()
print(now)

tomorrow = now + timedelta(days=1)
print(tomorrow)

later = now + timedelta(seconds=10)
print(later)

last_week_day = now - timedelta(weeks=1)
print(last_week_day)<jupyter_output>2021-11-15 10:04:54.444396
2021-11-16 10:04:54.444396
2021-11-15 10:05:04.444396
2021-11-08 10:04:54.444396<jupyter_text>Level 2: Handle Time Zones Skilfully `pytz`是经常被使用了，可以用来转化不同时区之间的时间，由于他不是内置函数，我们通过以下命令来安装。<jupyter_code>pip install pytz
from datetime import datetime
import pytz<jupyter_output><empty_output><jupyter_text>我们可以打印列表核对所有时区的名字<jupyter_code>print(pytz.all_timezones)<jupyter_output>['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara', 'Africa/Asmera', 'Africa/Bamako', 'Africa/Bangui', 'Africa/Banjul', 'Africa/Bissau', 'Africa/Blantyre', 'Africa/Brazzaville', 'Africa/Bujumbura', 'Africa/Cairo', 'Africa/Casablanca', 'Africa/Ceuta', 'Africa/Conakry', 'Africa/Dakar', 'Africa/Dar_es_Salaam', 'Africa/Djibouti', 'Africa/Douala', 'Africa/El_Aaiun', 'Africa/Freetown', 'Africa/Gaborone', 'Africa/Harare', 'Africa/Johannesburg', 'Africa/Juba', 'Africa/Kampala', 'Africa/Khartoum', 'Africa/Kigali', 'Africa/Kinshasa', 'Africa/Lagos', 'Africa/Libreville', 'Africa/Lome', 'Africa/Luanda', 'Africa/Lubumbashi', 'Africa/Lusaka', 'Africa/Malabo', 'Africa/Maputo', 'Africa/Maseru', 'Africa/Mbabane', 'Africa/Mogadishu', 'Africa/Monrovia', 'Africa/Nairobi', 'Africa/Ndjamena', 'Africa/Niamey', 'Africa/Nouakchott', 'Africa/Ouagadougou', 'Africa/Porto-Novo', 'Africa/Sao_Tome', 'Africa/Timbuktu', 'Africa/Tripoli', 'Africa/Tunis', 'Africa/Windhoek', 'Ameri[...]<jupyter_text>这样处理时区时间的时间变得简单：<jupyter_code>local = datetime.now()
print(local.strftime("%d/%m/%Y, %H:%M:%S"))

NY = pytz.timezone('America/New_York')
print(NY)

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


Hong_kong = pytz.timezone('Asia/Hong_Kong')
print(Hong_kong)

datetime_HK = datetime.now(Hong_kong)
print(datetime_HK.strftime("%d/%m/%Y, %H:%M:%S"))<jupyter_output>15/11/2021, 10:17:06
America/New_York
14/11/2021, 21:17:06
Asia/Hong_Kong
15/11/2021, 10:17:06<jupyter_text>Level 3: Clearly Understand Timestamps 为了更加有效率，时间在计算机中是用数字来表示的，我们可以定义一个特殊的时间，用0来表示，用它来计算其他的时间。这就是时间戳的想法。在 1970–01–01 00:00:00 的 UTC 时间被记作是0，被称为纪年时间或Unix时间，时间戳是相对纪元时间的秒数。- 在纪元时间之前的时间戳是负数- 在纪元时间之后的时间错是正数例如 1970–01–01 01:00:00 的时间戳是 3600，因为它是纪元时间后的一个小时，所以它等于3600秒。在Python中可以直接转化时间与时间戳。<jupyter_code>from datetime import datetime

now = datetime.now()
print(now.timestamp())

a_timestamp = 3600
print(now.utcfromtimestamp(a_timestamp))<jupyter_output>1636942889.322223
1970-01-01 01:00:00<jupyter_text>在上述例子中，datetime.timestamp 可以将时间转化为时间戳，datetime.utcfromtimestamp方法可以将时间戳转化为时间。时间戳与时区是没有关系的，时间戳如果是确定的，它的 UTC 时间也是确定的。然而，时间是相对于时区的，当我们转化一个时间戳到一个时间时，我们有两种选择。- utcfromtimestamp 将时间戳转化为 UTC 时间- fromtimestamp 将时间戳转化为当地时间<jupyter_code>print(datetime.utcfromtimestamp(0))
print(datetime.fromtimestamp(0))<jupyter_output>1970-01-01 00:00:00
1970-01-01 08:00:00<jupyter_text>Level 4: Switch Between Datetimes and Strings Properly 在字符串和时间之间进行转换也是日常需求，下面两个函数可以帮助我们：- strptime 转化字符串到一个时间对象- strftime 转化时间对象到字符串、注意：格式：%Y-%m-%d 或者 %a 是基于 [标准](https://webspace.science.uu.nl/~gent0113/calendar/isocalendar.htm)<jupyter_code>from datetime import datetime 

str_time = '2021-11-15 10:37:26'
t = datetime.strptime(str_time, '%Y-%m-%d %H:%M:%S')
print(t)
print(type(t))


now = datetime.now()
string_now = now.strftime('%a,  %d/%m/%Y %H:%M:%S')
print(string_now)
print(type(string_now))<jupyter_output>2021-11-15 10:37:26
<class 'datetime.datetime'>
Mon,  15/11/2021 10:41:40
<class 'str'>
{'fraction_non_alphanumeric': 0.15067650676506766, 'fraction_numerical': 0.06724067240672407, 'mean_word_length': 8.758, 'pattern_counts': {'":': 0, '<': 32, '<?xml version=': 0, '>': 32, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '552336', 'license': 'MIT', 'n_tokens_mistral': 2786, 'n_tokens_neox': 2634, 'n_words': 272, 'path': 'Medium Translation/datetime in detail.ipynb', 'repo_name': 'RankXiaoLong/MyPython_Memory', 'size': '4878'}