## 時間
在動畫片哆啦A夢里,有一集機器貓發明了時間機器。通過這個機器,可以在過去、現在、未來中穿梭,十分神奇。

這節課,我們學習一下用python怎么操作時間,顯示過去、現在、未來的時刻。
## 時間組成

我們知道時間是由 年月日時分秒來組成的,比如這個時間:`2018-08-28 13:56:10`。為了讓我們的時間能夠比較清楚的顯示,我們需要約定一個固定的格式顯示時間。比如我們舉的例子里,8月份雖然只占了一位,但是為了表示清楚,我們用08來嚴格固定月份的位置。
這樣我們的時間就可以用:`年年年年-月月-日日 時時-分分-秒秒`來組成了,我們經常會有英文的縮寫來表達:`YYYY-mm-dd HH:MM:SS`。
## 時間操作
那我們對時間能做哪些操作呢?
1. **定義一個時間**
2. **將時間按照某個格式輸出**
3. **更改一個時間的天、小時等**
4. **比較時間大小**
我們來看看用python怎么實現這些操作!
## python的時間定義
1. 獲取當前時間
~~~
from datetime import datetime
now = datetime.now()
print('now =', now)
~~~
注意看我們打印的結果:year-month-day hour:minute:second.microsecond
2. 定義一個指定時間的日期
~~~
dt = datetime(2015, 4, 19, 12, 20)
print('dt =', dt)
~~~
我們通過調用datetime函數,函數參數分別傳入:年、月、日、時、分、秒來定義一個指定的時間。(后面的部分不傳代表零分零秒等)
## 獲取時間信息
1. 獲取時分秒
datetime獲取的時間會返回一個時間對象,我們可以從里面獲取對應的:年、月、日、時、分、秒;只需要調用對應的:`now.year now.month now.day now.hour now.minute now.second` 即可。
2. datetime的日期部分和時間部分
我們知道,一個具體的時間包括:年月日的日期和時分秒的時間。這個用python里的:date、time 兩個對象來表示。
~~~
print(dt.date())
print(dt.time())
~~~
3. 增加時間 減少時間
我們如果想讓時間前進一天或者后退一小時,可以使用 `timedelta` 模塊。先看代碼:
~~~
from datetime import datetime, timedelta
cday = datetime.now()
print('current datetime =', cday)
print('current + 10 hours =', cday + timedelta(hours=10))
print('current - 1 day =', cday - timedelta(days=1))
print('current + 2.5 days =', cday + timedelta(days=2, hours=12))
~~~
我們可以直接使用類似數學加減的方式來增加時間和減少時間。注意timedelta方法的參數,因為我們可以更改的部分很多(年月日時分秒),所以我們可以使用指定參數名的方式只填入要更改的部分。
## 顯示日期
日期的顯示方式有很多,比如:`2018-08-28 13:56:10`、`2018年08月28日13點56分10秒`、`08月28日13點` 。在python里,可以使用datetime的strftime函數來格式化一個時間,看代碼:
~~~
cday = datetime.now()
print('strftime:', cday.strftime('%a, %b %d %H:%M'))
~~~
程序會輸出:`strftime: Mon, Jun 01 18:19`
strftime方法里傳入的參數就是我們想要讓日期展示的樣子。`%a, %b %d %H:%M`是日期的格式化字符。完整的格式化信息如下:
*%y 兩位數的年份表示(00-99)
%Y 四位數的年份表示(000-9999)
%m 月份(01-12)
%d 月內中的一天(0-31)
%H 24小時制小時數(0-23)
%I 12小時制小時數(01-12)
%M 分鐘數(00=59)
%S 秒(00-59)
%a 本地簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化的月份名稱
%B 本地完整的月份名稱
%c 本地相應的日期表示和時間表示
%j 年內的一天(001-366)
%p 本地A.M.或P.M.的等價符
%U 一年中的星期數(00-53)星期天為星期的開始
%w 星期(0-6),星期天為星期的開始
%W 一年中的星期數(00-53)星期一為星期的開始
%x 本地相應的日期表示
%X 本地相應的時間表示
%Z 當前時區的名稱*
## 時間戳?
我們知道,python里有只有數字和字符串兩種基礎類型,那像這種年月日時分秒的日期是怎么表示的呢?
python和其他大多數編程語言一樣,用一個數字來代表時間。數字時間精確到毫秒。0就代表 1970年1月1日 00:00:00。我們怎么從一個數字構建一個日期呢?看代碼:
~~~
from datetime import datetime
# 把timestamp轉換為datetime:
date = datetime.fromtimestamp(1535455200)
print(date)
# 把datetime轉換為timestamp:
print(date.timestamp())
~~~
用`timestamp`函數獲取日期對應的時間戳。
用`fromtimestamp`函數從時間戳獲取時間;
python對日期處理的函數較多,我們可以按照自己想做的事情找對應的方法,不應死記硬背每個函數。
## 小灶時間 為啥是1970年?

在講時間戳的時候,我們說0代表的時間是: 1970年1月1日 00:00:00,這是電腦的unix系統(linux、osx系統的前身)在發布的時候定義的起始時間。這個時間也叫做紀元時間(epoch time)。
**阿達老師-孩子身邊的編程專家**
- 課程介紹
- 搭建環境
- 什么是計算機
- 程序是怎么運行的
- 安裝python
- 項目實例-安裝IDE
- 變量和簡單數據類型
- 數據&變量
- 數字
- 字符串
- 布爾類型
- 項目實例
- 容器-列表
- 容器
- 列表
- 項目實例
- 容器-字典
- 定義字典
- 項目實例
- 數據類型總結
- 條件語句
- python條件語句
- 項目實例
- 循環語句
- for循環
- while循環
- 項目實例
- 函數
- 5.0函數定義
- 5.2函數實戰
- 6.文件系統
- 6.1 文件系統介紹&python查找文件
- 6.2 用python讀寫文件
- 7. python操作時間
- 8.面向對象
- 8.1 類和對象
- 8.2 繼承和重寫
- 8.3 面向對象項目實戰
- 9 GUI編程
- 9.1 GUI基礎
- 9.2 備忘清單GUI版
- 10.網絡
- 10.1 網絡的發展
- 10.2 python http
- 11.web開發
- 11.1 web基礎&HTML
- 11.2 CSS&JavaScript
- 11.3 網頁計算器
- 11.3 網站開發實戰-播客搭建
- 11.3 python-web
- 12. 項目實戰-數據處理
- 13. 項目實戰-AI入門
- 13.1 環境搭建
- 心得
- 13.2 Tensorflow的瓜怎么吃
- 14 pygame
- 14.1 pygame Helloworld
- 14.4 pygame 動畫基礎 Animation
- 從0開始學python第14.5節 pygame 加載圖片和聲音
- 從0開始學python第14.6節 pygame.sprite(上)
- 14.7 pygame.sprite模塊(下)
- 14.8 pygame射擊游戲(一)
- pygame射擊游戲(二)
- 14.8 pygame射擊游戲(三)
- 14.8 pygame射擊游戲(四)
- 14.8 pygame射擊游戲(五)