個人第一個python web開發框架(10)——工具函數包說明(一)

  PS:原先是想直接進入功能開發,要用到什麼函數時再建立,這樣也容易熟悉每一個函數的由來和使用方法,但考慮到這樣操做,到時會常常在不一樣文件間切換,很差描述,容易形成混亂,因此仍是使用函數庫這種方式來講明。python

  下面來講說工具函數包,若是想要快速學會一個新的框架,首先要作的事情就是熟悉工具函數包,一方面,能快速知道有哪些基本功能能夠直接調用,不用重複造輪子;另外一方面,查看項目代碼時,會比較快的進入角色,能看明白不少代碼是作什麼用的,由於工具函數包被調用的機率是最大的。web

   那麼怎麼學習呢?固然是有節奏有計劃的一步步深刻了,咱們能夠從上到下逐個查看研究,經過查看代碼,咱們能夠基本瞭解這個包有什麼功能,但也僅僅是瞭解而已,想要真正掌握,必需要去使用它們,最直接的方法就是編寫測試用例進行測試,這樣就能夠很快熟悉並掌握這些函數具體有什麼功能與限制。安全

 

  PS:你們在學習工具函數,或其餘封裝好的類或函數時,在開始時不須要去知道它裏面每一行代碼是作什麼用的,爲何要那麼寫,只須要知道輸入什麼參數會得出什麼值就能夠了,這就是你們所說的封裝。咱們要開汽車,不須要知道它是怎麼造出來的,發動機是怎麼運行的,只須要知道怎麼操做(接口)就能夠了。框架

   我之前遇到過幾位愛鑽牛角尖的開發者,想弄明白每一行代碼爲何要那樣寫,當那一行所調用的函數看不懂時,就會再深刻一層,看看它更底層是什麼原理......就這樣,通常人用幾分鐘就能夠知道怎麼用的,他花幾天也弄不明白,花了好長時間也無法寫代碼。對於初學者來講,學習一個函數怎麼使用,不要鑽牛角尖,去研究它的內部是怎麼運行的,要研究也要等到你之後精通了再說,否則你看到一個函數就去看它的源碼,而後源碼中又會調用其餘庫的源碼,其餘庫的源碼又會調用python的內核代碼,難道你要搞定python的內核代碼後才能夠開始開發嗎?你能搞的定python內核你就是超級大牛了,能夠本身開發一種新語言出來了。ide

   因此說想要快速學習,最好的辦法就是知道這個封裝好的函數是幹嗎的,它須要輸入什麼參數,會返回什麼內容就已經夠了。而最快的熟悉方法就是寫單元測試,用你能想到的辦法去測試,這樣就知道何時出錯,何時正常。函數

 

 

  熟悉相關工具函數:工具

  convert_helper.py是類型轉換包,全部字符串轉數值、字符串轉日期、字符串日期轉時間戳等各類類型轉換函數,均可以放到這裏來。單元測試

 

  1 #!/usr/bin/evn python
  2 # coding=utf-8
  3 
  4 import decimal
  5 import datetime
  6 
  7 
  8 #############################################
  9 # 數值型轉換函數
 10 #############################################
 11 def to_int(text):
 12     """將字符串安全轉換爲int類型,轉換失敗時默認值爲0"""
 13     try:
 14         return int(text)
 15     except:
 16         return 0
 17 
 18 
 19 def to_int0(text):
 20     """將字符串安全轉換爲int類型,當int值小於0時,返回0"""
 21     result = to_int(text)
 22 
 23     # 判斷轉換後的結果值是否小於0,是的話返回0
 24     if not result or result < 0:
 25         return 0
 26     else:
 27         return result
 28 
 29 
 30 def to_int1(text):
 31     """將字符串安全轉換爲int類型,當int值小於1時,返回1"""
 32     result = to_int(text)
 33 
 34     # 判斷轉換後的結果值是否小於1,是的話返回1
 35     if not result or result < 1:
 36         return 1
 37     else:
 38         return result
 39 
 40 
 41 def to_float(text):
 42     """將字符串安全轉換爲float類型"""
 43     try:
 44         return float(text)
 45     except:
 46         return 0.0
 47 
 48 
 49 def to_decimal(text):
 50     """將字符串安全轉換爲int類型"""
 51     try:
 52         return decimal.Decimal(text)
 53     except:
 54         return 0
 55 
 56 
 57 #############################################
 58 # 日期型轉換函數
 59 #############################################
 60 def to_datetime(text):
 61     """字符串轉時間"""
 62     if not text:
 63         return None
 64 
 65     # 定義字典根據時間字符串匹配不一樣的格式
 66     time_dict = {
 67         1: "%Y-%m-%d %H:%M:%S.%f",
 68         2: "%Y-%m-%d %H:%M",
 69         3: "%Y-%m-%d %H:%M:%S",
 70     }
 71     # 若是中間含有時間部分就用:判斷
 72     try:
 73         if str(text).find('.') > -1:
 74             return datetime.datetime.strptime(text, time_dict[1])
 75         elif ':' in text:
 76             time_list = text.split(':')
 77             return datetime.datetime.strptime(text, time_dict[len(time_list)])
 78         else:
 79             return datetime.datetime.strptime(text, "%Y-%m-%d")
 80     except:
 81         return None
 82 
 83 
 84 def to_date(text):
 85     """字符串轉日期"""
 86     d = to_datetime(text)
 87     if d:
 88         return d.date()
 89 
 90 
 91 def to_timestamp10(text):
 92     """將時間格式的字符串轉化爲長度爲10位長度的時間戳"""
 93     d = to_datetime(text)
 94     if d:
 95         return int(d.timestamp())
 96     else:
 97         return 0
 98 
 99 
100 def to_timestamp13(text):
101     """將時間格式的字符串轉化爲長度爲13位長度的時間戳"""
102     d = to_datetime(text)
103     if d:
104         return int(d.timestamp() * 1000)
105     else:
106         return 0
View Code

  好比說字符轉int函數學習

def to_int(text):
    """將字符串安全轉換爲int類型,轉換失敗時默認值爲0"""
    try:
        return int(text)
    except:
        return 0

  這裏咱們用try...except...來捕捉轉換函數出現的異常,當出現異常時咱們設置它的默認值爲0,讓咱們的系統變的更加健壯,不會由於轉換失敗而崩潰。測試

  使用這個函數轉換出現異常時,咱們只是直接將它轉換爲0,不作記錄,由於數值轉換時直接拋出異常會讓用戶體驗更差勁,另外對於數值類型來講,若是得出的結果都是0而不是指望值,這也很容易排查出來,在後面章節會講到web端接收到的請求值都會記錄下來,方便咱們排錯。

def to_int0(text):
    """將字符串安全轉換爲int類型,當int值小於0時,返回0"""
    result = to_int(text)

    # 判斷轉換後的結果值是否小於0,是的話返回0
    if not result or result < 0:
        return 0
    else:
        return result


def to_int1(text):
    """將字符串安全轉換爲int類型,當int值小於1時,返回1"""
    result = to_int(text)

    # 判斷轉換後的結果值是否小於1,是的話返回1
    if not result or result < 1:
        return 1
    else:
        return result

  你們可能會奇怪,爲何要增長這兩個多餘的函數?事實上,這兩個函數使用頻率比前面那個會更高,由於咱們在平常使用當中,常常會要求數值不能小於0或小於1,而to_int()函數轉換時,用戶若是輸入了負數,雖然轉換成功了,但這個值卻不是咱們想要的結果,若是每次都要加上一段代碼對值進行判斷,那會更加麻煩,因此進行了再次封裝,多出來to_int0()和to_int()1兩個函數。

  對這幾個函數咱們用unittest測試一下,看看結果。

  咱們在test文件夾建立一個convert_helper_test.py文件,並編寫測試代碼,用來測試輸入各類值,看看是否獲得咱們指望的值。(PS:使用debug運行時,光標在那個函數中,unittest就會運行那個測試函數,因此若是有多個測試函數要運行時,最好用鼠標點擊一下main函數,即入口函數,再運行debug,這樣所有測試函數都會運行到

#!/usr/bin/evn python
# coding=utf-8

import datetime
import unittest
from common import convert_helper


class ConvertHelperTest(unittest.TestCase):
    """轉換操做包測試類"""

    def setUp(self):
        """初始化測試環境"""
        print('------ini------')

    def tearDown(self):
        """清理測試環境"""
        print('------clear------')

def test_to_int(self):
        self.assertEqual(convert_helper.to_int('1'), 1)
        self.assertEqual(convert_helper.to_int('1.0'), 0)
        self.assertEqual(convert_helper.to_int('1a'), 0)
        self.assertEqual(convert_helper.to_int('aaa'), 0)
        self.assertEqual(convert_helper.to_int(''), 0)
        self.assertEqual(convert_helper.to_int(None), 0)
        self.assertEqual(convert_helper.to_int('-1'), -1)
        self.assertEqual(convert_helper.to_int(10), 10)
        self.assertEqual(convert_helper.to_int(-10), -10)

        self.assertEqual(convert_helper.to_int0('1'), 1)
        self.assertEqual(convert_helper.to_int0('1.0'), 0)
        self.assertEqual(convert_helper.to_int0('1a'), 0)
        self.assertEqual(convert_helper.to_int0('aaa'), 0)
        self.assertEqual(convert_helper.to_int0(''), 0)
        self.assertEqual(convert_helper.to_int0(None), 0)
        self.assertEqual(convert_helper.to_int0('-1'), 0)
        self.assertEqual(convert_helper.to_int0(10), 10)
        self.assertEqual(convert_helper.to_int0(-10), 0)

        self.assertEqual(convert_helper.to_int1('1'), 1)
        self.assertEqual(convert_helper.to_int1('1.0'), 1)
        self.assertEqual(convert_helper.to_int1('1a'), 1)
        self.assertEqual(convert_helper.to_int1('aaa'), 1)
        self.assertEqual(convert_helper.to_int1(''), 1)
        self.assertEqual(convert_helper.to_int1(None), 1)
        self.assertEqual(convert_helper.to_int1('-1'), 1)
        self.assertEqual(convert_helper.to_int1(10), 10)
        self.assertEqual(convert_helper.to_int1(-10), 1)


if __name__ == '__main__':
    unittest.main()

  在這個單元測試中,咱們使用的是python自帶的unittest這個模塊。

  這裏咱們調用了unittest的斷言函數assertEqual(等於)來判斷convert_helper包的to_int()、to_int0()、to_int1()函數的執行結果是否和咱們設定的值一致

  經過測試能夠看到,to_int系列函數的值是不同的:

輸入值

調用函數

to_int()

調用函數

to_int0()

調用函數

to_int1()

非數值型字符串 0 0 1
-1 -1 0 1
10 10 10 10

 

  unittest還有不少其餘斷言函數提供給咱們使用,好比assertNotEqual(不等於)、assertGreaterEqual(大於等於)、assertGreater(大於)、assertAlmostEqual(約等於)、assertIsNotNone(不等於None)、assertIn(in)、assertNotIn(not in)、assertIs(is)、assertDictEqual(字典比較)、assertListEqual(列表比較)......還有好多其餘類型的判斷處理。

  使用單元測試除了上面所說的好處外,它還能夠幫助咱們實現自動化測試。好比說項目開發的過程當中,有人修改了底層的這些工具函數,增長了新的判斷處理,這可能只是一個小小的修改,你們都以爲不會有什麼問題,但有可能這點小改動會形成災難性的故障(我本人就試過,有些很小很小的改動,對多個合做客戶調用的接口測試過也沒有問題,可沒想到遺漏了另一個客戶的測試,而後形成那個合做客戶的用戶訪問都出現異常,沒法從個人系統中讀取到數據)。而有了這些已經實現了的自動化測試用例在,修改過或上線前,只須要簡單的點一下運行,就能夠幫咱們對全部函數都進行全面的測試,幫咱們及時找到可能出現的Bug。

 

  對於float類型數值和decimal類型數值,若是有須要,你們也能夠本身去添加0或1最小值的判斷。

  to_datetime()函數,會根據輸入的日期字符串格式,轉換成對應的日期(如:2017-09-01)、日期時間(2017-09-01 11:11)、日期時分秒(2017-09-01 11:11:11)、日期時分秒毫秒類型(2017-09-01 11:11:11.111),獲得的值是datetime類型

  固然也能夠直接使用打印輸出結果的方式來進行測試,不過結果沒法自動進行判斷是不是咱們指望的值

    def test_to_datetime(self):
        print('---test_to_datetime---')
        print(convert_helper.to_datetime(None))
        print(convert_helper.to_datetime(''))
        print(convert_helper.to_datetime('xxx'))
        print(convert_helper.to_datetime('2017-09-01'))
        print(convert_helper.to_datetime('2017-09-01 11:11'))
        print(convert_helper.to_datetime('2017-09-0111:11'))
        print(convert_helper.to_datetime('2017-09-01 11:11:11'))
        print(convert_helper.to_datetime('2017-09-01 11:11:11.111'))

  獲得的結果是:

---test_to_datetime---
None
None
None
2017-09-01 00:00:00
2017-09-01 11:11:00
None
2017-09-01 11:11:11
2017-09-01 11:11:11.111000

   對於日期類的測試若是使用斷言,咱們一般要建立生成一個日期變量,而後在進行判斷

        self.assertEqual(convert_helper.to_datetime(None), None)
        self.assertEqual(convert_helper.to_datetime(''), None)
        self.assertEqual(convert_helper.to_datetime('xxx'), None)
        result = datetime.datetime(2017, 9, 1)
        self.assertEqual(convert_helper.to_datetime('2017-09-01'), result)
        result = datetime.datetime(2017, 9, 1, 11, 11)
        self.assertEqual(convert_helper.to_datetime('2017-09-01 11:11'), result)
        self.assertEqual(convert_helper.to_datetime('2017-09-0111:11'), None)
        result = datetime.datetime(2017, 9, 1, 11, 11, 11)
        self.assertEqual(convert_helper.to_datetime('2017-09-01 11:11:11'), result)
        result = datetime.datetime(2017, 9, 1, 11, 11, 11, 111000)
        self.assertEqual(convert_helper.to_datetime('2017-09-01 11:11:11.111'), result)

  to_date()函數是用來將各類格式的日期字符串,轉換爲只含年月日(2017-09-01)的日期格式,具體你們使用代碼測試一下就知道了

  to_timestamp10()函數是用來將各類格式的日期字符串,轉換爲長度爲10位長度的時間戳

  to_timestamp13()函數是用來將各類格式的日期字符串,轉換爲長度爲13位長度的時間戳

  具體這些測試例子,可下載文章後面的源碼包查看了解

 

 

  下面咱們來熟悉一下datetime_helper.py這個日期函數操做包,這個包裏的函數類型主要有兩大類,一種是日期類型轉換,將日期類型格式化爲字符串類型或轉換爲數值類型;另外一種是對日期類型的比較或運算。

  先上代碼:

 

 1 #!/usr/bin/evn python
 2 # coding=utf-8
 3 
 4 import time
 5 import datetime
 6 
 7 
 8 def to_date(dt):
 9     """將時間格式化爲日期字符串"""
10     if isinstance(dt, datetime.datetime):
11         return dt.strftime('%Y-%m-%d')
12     elif isinstance(dt, datetime.date):
13         return dt.strftime('%Y-%m-%d')
14     else:
15         raise Exception("日期類型錯誤")
16 
17 
18 def to_datetime(dt):
19     """將時間格式化爲日期時間字符串"""
20     if isinstance(dt, datetime.datetime):
21         return dt.strftime('%Y-%m-%d %H:%M:%S')
22     elif isinstance(dt, datetime.date):
23         return dt.strftime('%Y-%m-%d')
24     else:
25         raise Exception("日期類型錯誤")
26 
27 
28 def to_number():
29     """當前時間轉換爲年月日時分秒毫秒共10位數的字符串"""
30     return datetime.datetime.now().strftime('%Y%m%d%H%M%S')
31 
32 
33 def to_timestamp10():
34     """獲取當前時間長度爲10位長度的時間戳"""
35     return int(time.time())
36 
37 
38 def to_timestamp13():
39     """獲取當前時間長度爲13位長度的時間戳"""
40     return int(time.time() * 1000)
41 
42 
43 def timedelta(sign, dt, value):
44     """
45     對指定時間進行加減運算,幾秒、幾分、幾小時、幾日、幾周、幾月、幾年
46     sign: y = 年, m = 月, w = 周, d = 日, h = 時, n = 分鐘, s = 秒
47     dt: 日期,只能是datetime或datetime.date類型
48     value: 加減的數值
49     return: 返回運算後的datetime類型值
50     """
51     if not isinstance(dt, datetime.datetime) and not isinstance(dt, datetime.date):
52         raise Exception("日期類型錯誤")
53 
54     if sign == 'y':
55         year = dt.year + value
56         if isinstance(dt, datetime.date):
57             return datetime.datetime(year, dt.month, dt.day)
58         elif isinstance(dt, datetime.datetime):
59             return datetime.datetime(year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond)
60         else:
61             return None
62     elif sign == 'm':
63         year = dt.year
64         month = dt.month + value
65         ### 若是月份加減後超出範圍,則須要計算一下,對年份進行處理 ###
66         # 若是月份加減後等於0時,須要特殊處理一下
67         if month == 0:
68             year = year - 1
69             month = 12
70         else:
71             # 對年月進行處理
72             year = year + month // 12
73             month = month % 12
74         if isinstance(dt, datetime.date):
75             return datetime.datetime(year, month, dt.day)
76         elif isinstance(dt, datetime.datetime):
77             return datetime.datetime(year, month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond)
78         else:
79             return None
80     elif sign == 'w':
81         delta = datetime.timedelta(weeks=value)
82     elif sign == 'd':
83         delta = datetime.timedelta(days=value)
84     elif sign == 'h':
85         delta = datetime.timedelta(hours=value)
86     elif sign == 'n':
87         delta = datetime.timedelta(minutes=value)
88     elif sign == 's':
89         delta = datetime.timedelta(seconds=value)
90     else:
91         return None
92 
93     return dt + delta
View Code

 

  to開頭的函數都是時間類型轉換函數(PS:convert_helper.py包裏是對日期格式字符串轉爲時間類型,而datetime_helper.py裏全部操做,都是對時間類型進行處理的,將它們轉爲其餘格式)

  好比to_date()和to_datetime(),這兩個函數分別是將時間類型格式化爲年月日(2017-09-01)、年月日時分秒(2017-09-01 11:11:11)或數值字符串(20170901111111)

def to_date(dt):
    """將時間格式化爲日期字符串"""
    if isinstance(dt, datetime.datetime):
        return dt.strftime('%Y-%m-%d')
    elif isinstance(dt, datetime.date):
        return dt.strftime('%Y-%m-%d')
    else:
        raise Exception("日期格式錯誤")

def to_datetime(dt):
    """將時間格式化爲日期時間字符串"""
    if isinstance(dt, datetime.datetime):
        return dt.strftime('%Y-%m-%d %H:%M:%S')
    elif isinstance(dt, datetime.date):
        return dt.strftime('%Y-%m-%d')
    else:
        raise Exception("日期格式錯誤")

def to_number():
    """將當前時間轉換爲年月日時分秒毫秒共14位數的字符串"""
    return datetime.datetime.now().strftime('%Y%m%d%H%M%S')

  而to_timestamp10()和to_timestamp13()是獲取當前時間的時間戳

def to_timestamp10():
    """獲取當前時間長度爲10位長度的時間戳"""
    return int(time.time())

def to_timestamp13():
    """獲取當前時間長度爲13位長度的時間戳"""
    return int(time.time() * 1000)

  對這種輸出類型的函數測試,咱們測試時直接打印到控制檯就能夠了

  在test文件夾中建立datetime_helper_test.py文件,而後經過打印來查看各函數會輸出什麼值

#!/usr/bin/evn python
# coding=utf-8

import datetime
import unittest
from common import datetime_helper


class DatetimeHelperTest(unittest.TestCase):
    """日期函數操做包測試類"""

    def setUp(self):
        """初始化測試環境"""
        print('------ini------')

    def tearDown(self):
        """清理測試環境"""
        print('------clear------')

    def test(self):
        dt = datetime.datetime.now()
        print(datetime_helper.to_datetime(dt))
        print(datetime_helper.to_date(dt))
        print(datetime_helper.to_number())
        print(datetime_helper.to_timestamp10())
        print(datetime_helper.to_timestamp13())
if __name__ == '__main__':
    unittest.main()

  運行後打印到控制檯上的值:

------ini------
2017-09-01 18:45:39
2017-09-01
20170901184539
1504262739
1504262739217
------clear------

  

 1 def timedelta(sign, dt, value):
 2     """
 3     對指定時間進行加減運算,幾秒、幾分、幾小時、幾日、幾周、幾月、幾年
 4     sign: y = 年, m = 月, w = 周, d = 日, h = 時, n = 分鐘, s = 秒
 5     dt: 日期,只能是datetime或datetime.date類型
 6     value: 加減的數值
 7     return: 返回運算後的datetime類型值
 8     """
 9     if not isinstance(dt, datetime.datetime) and not isinstance(dt, datetime.date):
10         raise Exception("日期類型錯誤")
11 
12     if sign == 'y':
13         year = dt.year + value
14         if isinstance(dt, datetime.date):
15             return datetime.datetime(year, dt.month, dt.day)
16         elif isinstance(dt, datetime.datetime):
17             return datetime.datetime(year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond)
18         else:
19             return None
20     elif sign == 'm':
21         year = dt.year
22         month = dt.month + value
23         ### 若是月份加減後超出範圍,則須要計算一下,對年份進行處理 ###
24         # 若是月份加減後等於0時,須要特殊處理一下
25         if month == 0:
26             year = year - 1
27             month = 12
28         else:
29             # 對年月進行處理
30             year = year + month // 12
31             month = month % 12
32         if isinstance(dt, datetime.date):
33             return datetime.datetime(year, month, dt.day)
34         elif isinstance(dt, datetime.datetime):
35             return datetime.datetime(year, month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond)
36         else:
37             return None
38     elif sign == 'w':
39         delta = datetime.timedelta(weeks=value)
40     elif sign == 'd':
41         delta = datetime.timedelta(days=value)
42     elif sign == 'h':
43         delta = datetime.timedelta(hours=value)
44     elif sign == 'n':
45         delta = datetime.timedelta(minutes=value)
46     elif sign == 's':
47         delta = datetime.timedelta(seconds=value)
48     else:
49         return None
50 
51     return dt + delta
View Code

  timedelta()函數,它主要用於時間的加減運算,能夠得出加減幾秒、幾分、幾小時、幾日、幾周、幾月、幾年後的時間值是什麼,這個函數在實際開發中使用頻率還算是挺高的。

  PS:原datetime.timedelta函數沒有對年和月的加減運算,對這個我進行了擴展,增長了年和月的加減計算

 

   def test_timedelta(self):
        print('---test_timedelta---')
        result = datetime.datetime(2018, 9, 1)
        print(result)
        self.assertEqual(datetime_helper.timedelta('y', datetime.datetime(2017, 9, 1), 1), result)
        result = datetime.datetime(2016, 9, 1)
        print(result)
        self.assertEqual(datetime_helper.timedelta('y', datetime.datetime(2017, 9, 1), -1), result)
        result = datetime.datetime(2018, 3, 1)
        print(result)
        self.assertEqual(datetime_helper.timedelta('m', datetime.datetime(2017, 9, 1), 6), result)
        result = datetime.datetime(2017, 3, 1)
        print(result)
        self.assertEqual(datetime_helper.timedelta('m', datetime.datetime(2017, 9, 1), -6), result)
        result = datetime.datetime(2017, 3, 1)
        print(result)
        self.assertEqual(datetime_helper.timedelta('m', datetime.datetime(2017, 9, 1), -6), result)
        result = datetime.datetime(2017, 9, 8)
        print(result)
        self.assertEqual(datetime_helper.timedelta('w', datetime.datetime(2017, 9, 1), 1), result)
        result = datetime.datetime(2017, 8, 25)
        print(result)
        self.assertEqual(datetime_helper.timedelta('w', datetime.datetime(2017, 9, 1), -1), result)
        result = datetime.datetime(2017, 9, 2)
        print(result)
        self.assertEqual(datetime_helper.timedelta('d', datetime.datetime(2017, 9, 1), 1), result)
        result = datetime.datetime(2017, 8, 31)
        print(result)
        self.assertEqual(datetime_helper.timedelta('d', datetime.datetime(2017, 9, 1), -1), result)
        result = datetime.datetime(2017, 9, 1, 1)
        print(result)
        self.assertEqual(datetime_helper.timedelta('h', datetime.datetime(2017, 9, 1), 1), result)
        result = datetime.datetime(2017, 8, 31, 23)
        print(result)
        self.assertEqual(datetime_helper.timedelta('h', datetime.datetime(2017, 9, 1), -1), result)
        result = datetime.datetime(2017, 9, 1, 0, 1)
        print(result)
        self.assertEqual(datetime_helper.timedelta('n', datetime.datetime(2017, 9, 1), 1), result)
        result = datetime.datetime(2017, 8, 31, 23, 59)
        print(result)
        self.assertEqual(datetime_helper.timedelta('n', datetime.datetime(2017, 9, 1), -1), result)
        result = datetime.datetime(2017, 9, 1, 0, 0, 1)
        print(result)
        self.assertEqual(datetime_helper.timedelta('s', datetime.datetime(2017, 9, 1), 1), result)
        result = datetime.datetime(2017, 8, 31, 23, 59, 59)
        print(result)
        self.assertEqual(datetime_helper.timedelta('s', datetime.datetime(2017, 9, 1), -1), result)

   運行後打印到控制檯上的值:

------ini------
---test_timedelta---
2018-09-01 00:00:00
2016-09-01 00:00:00
2018-03-01 00:00:00
2017-03-01 00:00:00
2017-03-01 00:00:00
2017-09-08 00:00:00
2017-08-25 00:00:00
2017-09-02 00:00:00
2017-08-31 00:00:00
2017-09-01 01:00:00
2017-08-31 23:00:00
2017-09-01 00:01:00
2017-08-31 23:59:00
2017-09-01 00:00:01
2017-08-31 23:59:59
------clear------

 

  本文對應的源碼下載

 

版權聲明:本文原創發表於 博客園,做者爲 AllEmpty 本文歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然視爲侵權。

python開發QQ羣:669058475(本羣已滿)、733466321(能夠加2羣)    做者博客:http://www.cnblogs.com/EmptyFS/

相關文章
相關標籤/搜索