Home >  > 一天学会Python Web框架(四)工具函数

一天学会Python Web框架(四)工具函数

0

一、convert_helper.py

在common文件夹下面建立convert_helper.py文件。

convert_helper.py是类型转换包,所有字符串转数值、字符串转日期、字符串日期转时间戳等各种类型转换函数,都可以放到这里来。

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

import decimal
import datetime


#############################################
# 数值型转换函数
#############################################
def to_int(text):
    """将字符串安全转换为int类型,转换失败时默认值为0"""
    try:
        return int(text)
    except:
        return 0


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


def to_float(text):
    """将字符串安全转换为float类型"""
    try:
        return float(text)
    except:
        return 0.0


def to_decimal(text):
    """将字符串安全转换为int类型"""
    try:
        return decimal.Decimal(text)
    except:
        return 0


#############################################
# 日期型转换函数
#############################################
def to_datetime(text):
    """字符串转时间"""
    if not text:
        return None

    # 定义字典根据时间字符串匹配不同的格式
    time_dict = {
        1: "%Y-%m-%d %H:%M:%S.%f",
        2: "%Y-%m-%d %H:%M",
        3: "%Y-%m-%d %H:%M:%S",
    }
    # 如果中间含有时间部分就用:判断
    try:
        if str(text).find('.') > -1:
            return datetime.datetime.strptime(text, time_dict[1])
        elif ':' in text:
            time_list = text.split(':')
            return datetime.datetime.strptime(text, time_dict[len(time_list)])
        else:
            return datetime.datetime.strptime(text, "%Y-%m-%d")
    except:
        return None


def to_date(text):
    """字符串转日期"""
    d = to_datetime(text)
    if d:
        return d.date()


def to_timestamp10(text):
    """将时间格式的字符串转化为长度为10位长度的时间戳"""
    d = to_datetime(text)
    if d:
        return int(d.timestamp())
    else:
        return 0


def to_timestamp13(text):
    """将时间格式的字符串转化为长度为13位长度的时间戳"""
    d = to_datetime(text)
    if d:
        return int(d.timestamp() * 1000)
    else:
        return 0

比如说字符转int函数

def to_int(text):
    """将字符串安全转换为int类型,转换失败时默认值为0"""
    try:
        return int(text)
    except:
        return 0

在日常使用当中,经常会要求数值不能小于0或小于1,而to_int()函数转换时,用户如果输入了负数,虽然转换成功了,但这个值却不是我们想要的结果,如果每次都要加上一段代码对值进行判断,那会更加麻烦,所以进行了再次封装,多出来to_int0()和to_int()1两个函数。

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

 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'))

二、datetime_helper.py
这个日期函数操作包,这个包里的函数类型主要有两大类,一种是日期类型转换,将日期类型格式化为字符串类型或转换为数值类型;另一种是对日期类型的比较或运算。

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

import time
import datetime


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():
    """当前时间转换为年月日时分秒毫秒共10位数的字符串"""
    return datetime.datetime.now().strftime('%Y%m%d%H%M%S')


def to_timestamp10():
    """获取当前时间长度为10位长度的时间戳"""
    return int(time.time())


def to_timestamp13():
    """获取当前时间长度为13位长度的时间戳"""
    return int(time.time() * 1000)


def timedelta(sign, dt, value):
    """
    对指定时间进行加减运算,几秒、几分、几小时、几日、几周、几月、几年
    sign: y = 年, m = 月, w = 周, d = 日, h = 时, n = 分钟, s = 秒
    dt: 日期,只能是datetime或datetime.date类型
    value: 加减的数值
    return: 返回运算后的datetime类型值
    """
    if not isinstance(dt, datetime.datetime) and not isinstance(dt, datetime.date):
        raise Exception("日期类型错误")

    if sign == 'y':
        year = dt.year + value
        if isinstance(dt, datetime.date):
            return datetime.datetime(year, dt.month, dt.day)
        elif isinstance(dt, datetime.datetime):
            return datetime.datetime(year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond)
        else:
            return None
    elif sign == 'm':
        year = dt.year
        month = dt.month + value
        ### 如果月份加减后超出范围,则需要计算一下,对年份进行处理 ###
        # 如果月份加减后等于0时,需要特殊处理一下
        if month == 0:
            year = year - 1
            month = 12
        else:
            # 对年月进行处理
            year = year + month // 12
            month = month % 12
        if isinstance(dt, datetime.date):
            return datetime.datetime(year, month, dt.day)
        elif isinstance(dt, datetime.datetime):
            return datetime.datetime(year, month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond)
        else:
            return None
    elif sign == 'w':
        delta = datetime.timedelta(weeks=value)
    elif sign == 'd':
        delta = datetime.timedelta(days=value)
    elif sign == 'h':
        delta = datetime.timedelta(hours=value)
    elif sign == 'n':
        delta = datetime.timedelta(minutes=value)
    elif sign == 's':
        delta = datetime.timedelta(seconds=value)
    else:
        return None

    return dt + delta

to开头的函数都是时间类型转换函数(PS:convert_helper.py包里是对日期格式字符串转为时间类型,而datetime_helper.py里所有操作,都是对时间类型进行处理的,将它们转为其他格式)

暧昧帖

本文暂无标签

发表评论

*

*