Python時間模組常用操作總結

TigerJin發表於2021-09-09

時間模組常用操作總結為下列各個函式:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import time
import datetime
import calendar


def second_to_datetime_string(seconds):
    """
    將從公元0年開始的秒數轉換為datetime的string形式
    :param seconds: 從公元0年開始的秒數
    :return: datetime的string形式
    """
    s = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(float(seconds)))
    year = s.split('-', 1)[0]
    rest = s.split('-', 1)[1]
    year = int(year) - 1970  # datetime是從1970開始的,因此計算時需要減去1970
    return '{}-{}'.format(str(year), rest)


def gregorian_date_to_str(year, month, day):
    """
    將公元日期轉換成字串,year佔4位,month佔2位,day佔2位,位數不足補0
    :param year: 年份,例如2017
    :param month: 月份,例如8或者08
    :param day: 天,例如12或者02或者2
    :return: 返回位數固定的字串,例如2017-08-22
    """
    return '{}-{}-{}'.format(
        year,
        month if len(str(month)) == 2 else '0{}'.format(month),
        day if len(str(day)) == 2 else '0{}'.format(day)
    )


def gregorian_date_to_str_1(year, month, day):
    """
    將公元日期轉換成字串,year佔4位,month佔2位,day佔2位,位數不足補0
    :param year: 年份,例如2017
    :param month: 月份,例如8或者08
    :param day: 天,例如12或者02或者2
    :return: 返回位數固定的字串,不帶-,例如20170822
    """
    return '{}{}{}'.format(
        year,
        month if len(str(month)) == 2 else '0{}'.format(month),
        day if len(str(day)) == 2 else '0{}'.format(day)
    )


def get_element_from_date_str(date_str):
    """獲取一個日期字串的年月日"""
    return date_str[0:4], date_str[4:6], date_str[6:8]


def is_valid_date(date_str):
    """判斷是否是一個有效的日期字串"""
    try:
        time.strptime(date_str, '%Y%m%d')
        return True
    except ValueError:
        return False


def get_latter_1_day_str(date_str):
    """
    獲取data_str後一天的日期字串
    :param date_str: 指定日期字串
    :return: 返回指定日期字串後一天的日期字串
    """
    dt = datetime.datetime.strptime(date_str, '%Y%m%d')
    one_day = datetime.timedelta(days=1)
    former_day = dt + one_day
    return former_day.strftime('%Y%m%d')


def get_latter_n_day_str(date_str, n):
    """
    獲取data_str後n天的日期字串
    :param date_str: 指定日期字串
    :return: 返回指定日期字串後n天的日期字串
    """
    dt = datetime.datetime.strptime(date_str, '%Y%m%d')
    one_day = datetime.timedelta(days=days)
    former_day = dt + one_day
    return former_day.strftime('%Y%m%d')


def get_yesterday_str():
    """
    獲取昨天的日期字串
    :return: 返回昨天日期字串
    """
    today = datetime.date.today()
    one_day = datetime.timedelta(days=1)
    yesterday = today - one_day
    return yesterday.strftime('%Y%m%d')


def get_former_1_day_str(date_str):
    """
    獲取data_str前一天的日期字串
    :param date_str: 指定日期字串
    :return: 返回指定日期字串前一天的日期字串
    """
    dt = datetime.datetime.strptime(date_str, '%Y%m%d')
    one_day = datetime.timedelta(days=1)
    former_day = dt - one_day
    return former_day.strftime('%Y%m%d')


def get_former_n_day_str(date_str, n):
    """
    獲取data_str前n天的日期字串
    :param date_str: 指定日期字串
    :param n: number of day
    :return: 返回指定日期字串前n天的日期字串
    """
    dt = datetime.datetime.strptime(date_str, '%Y%m%d')
    n_day = datetime.timedelta(days=n)
    former_n_day = dt - n_day
    return former_n_day.strftime('%Y%m%d')


def get_universal_time():
    """
    獲取當前時間
    :return: 返回當前時間,格式:2017-08-29 02:43:19
    """
    t = time.gmtime()
    time_tuple = (t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)
    dt = datetime.datetime(*time_tuple)
    return dt.strftime('%Y-%m-%d %H:%M:%S')


def datetime_to_gregorian_seconds(dt):
    """
    獲取從公元0年1月1日開始到當天0點所經過的秒數
    :param dt: datetime.datetime型別
    :return: 返回從公元0年1月1日開始到當天0點所經過的秒數
    """
    d = dt.date()
    t = dt.time()
    # toordinal 從1年1月1日開始, erlang 的datetime_to_gregorian_seconds和date_to_gregorian_days從0年1月1日開始
    # 當天不算所以需要減1天
    return (d.toordinal() + 365 - 1) * 86400 + time_to_second(t.hour, t.minute, t.second)


def time_to_second(time_h, time_m, time_s):
    """
    根據給定的time_h, time_m, time_s計算當天已過去的時間,秒為單位
    :param time_h: 小時
    :param time_m: 分
    :param time_s: 秒
    :return: 返回計算的second
    """
    return int(time_h) * 3600 + int(time_m) * 60 + int(time_s)


def utc_time_to_second(utc_time):
    """
    根據給定的utc_time計算當天已過去的時間,秒為單位
    :param utc_time: utc時間戳,類似1464830584
    :return: 返回計算的second
    """
    t = datetime.datetime.fromtimestamp(int(utc_time))
    return t.hour * 3600 + t.minute * 60 + t.second


def get_today_start_time():
	"""獲取當天開始時間"""
	dt = datetime.datetime.combine(datetime.date.today(), datetime.time.min)
	return dt.strftime('%Y-%m-%d %H:%M:%S')


def get_today_end_time():
	"""獲取當天結束時間"""
	dt = datetime.datetime.combine(datetime.date.today(), datetime.time.max)
	return dt.strftime('%Y-%m-%d %H:%M:%S')


def get_final_day_of_current_week():
	"""獲取本週最後一天:周天"""
	today = datetime.date.today()
	sunday = today + datetime.timedelta(6 - today.weekday())
	return sunday.strftime('%Y-%m-%d')


def get_final_day_of_current_month():
	"""獲取本月最後一天"""
	today = datetime.date.today()
	_, last_day_num = calendar.monthrange(today.year, today.month)
	last_day = datetime.date(today.year, today.month, last_day_num)
	return last_day.strftime('%Y-%m-%d')


def get_final_day_of_last_month():
	"""獲取上月最後一天,可能會跨年,需要用timedelta"""
	today = datetime.date.today()
	first = datetime.date(day=1, month=today.month, year=today.year)
	final_day_of_last_month = first - datetime.timedelta(days=1)
	return final_day_of_last_month.strftime('%Y-%m-%d')


def get_final_day_of_current_month(year, month):
	"""獲取指定年指定月的最後一天"""
	_, last_day_num = calendar.monthrange(year, month)
	return last_day_num
	# last_day = datetime.date(year, month, last_day_num)
	# return last_day.strftime('%Y-%m-%d')


記得幫我點贊哦!

念念不忘,必有迴響,小夥伴們幫我點個贊吧,非常感謝。

> 我是職場亮哥,YY高階軟體工程師、四年工作經驗,拒絕鹹魚爭當龍頭的斜槓程式設計師。
>
> 聽我說,進步多,程式人生一把梭
>
> 如果有幸能幫到你,請幫我點個【贊】,給個關注,如果能順帶評論給個鼓勵,將不勝感激。

本人所有文章、回答都與版權保護平臺有合作,著作權歸職場亮哥所有,未經授權,轉載必究!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2144/viewspace-2826643/,如需轉載,請註明出處,否則將追究法律責任。

相關文章