python3:时间获取与操作

原创文章,转载请注明出处

一.术语解释

1. 时间戳

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。

2. UTC

协调世界时,又称世界统一时间、世界标准时间、国际协调时间。由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。
协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。

3. DST

DST是Daylight Saving Time的缩写,称为阳光节约时,在我国称为夏时制,又称夏令时,是一种为节约能源而人为调整地方时间的制度。

4. 格式化日期

将时间按照一定的格式进行格式化。
例如:格式化成2016-03-20 11:45:39形式、格式化成Sat Mar 28 22:24:24 2016形式

5. 时间元组

很多Python函数用一个元组装起来的9组数字处理时间:time.struct_time(tm_year=2019, tm_mon=4, tm_mday=26, tm_hour=17, tm_min=4, tm_sec=4, tm_wday=4, tm_yday=116, tm_isdst=0)


image.png

二. 时间戳

1. 获取当前时间戳

import time

def get_timestamp():
    """
    获取当前时间戳
    :return:1556274213.430633
    """
    return time.time()

输出结果:1556274213.430633

2. 时间戳和UTC时间相互转换

import datetime
import pytz

def timestamp_to_utc(timestamp):
    """
    时间戳转换为utc时间
    :param timestamp:
    :return: 2019-04-26 16:12:58
    """
    return datetime.datetime.utcfromtimestamp(timestamp).isoformat()

def utc_to_timestamp(utc, utc_format='%Y-%m-%dT%H:%M:%S'):
    """
    utc时间转换为时间戳
    :param utc: utc时间
    :param utc_format: utc时间格式
    :return:时间戳:1556294670
    """

    # 定义本地时区
    local_tz = pytz.timezone('Asia/Shanghai')

    # 将utc时间的格式转化为datetime.datetime格式
    utc_dt = datetime.datetime.strptime(utc, utc_format)

    # 将datetime格式添加上世界时区,然后astimezone切换时区:世界时区==>本地时区
    local_dt = utc_dt.replace(tzinfo=pytz.utc).astimezone(local_tz)

    # 转换为时间元组
    timetuple = local_dt.timetuple()

    return int(time.mktime(timetuple))

3. 时间戳和格式化日期相互转换

import time

def timestamp_to_formattime(timestamp):
    """
    时间戳转换为格式化时间
    :param timestamp:时间戳
    :return: 格式化时间
    """
    return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp))

def formattime_to_timestamp(formattime, format='%Y-%m-%d %H:%M:%S'):
    """
    格式化时间转换为时间戳
    :param formattime: 格式化时间
    :return: 时间戳
    """
    return time.mktime(time.strptime(formattime, format))

4. 时间戳和时间元组相互转换

import time

def timestamp_to_timetuple(timestamp):
    """
    时间戳转时间元组
    :param timestamp:
    :return: time.struct_time(tm_year=2019, tm_mon=4, tm_mday=26, tm_hour=17, tm_min=4, tm_sec=4, tm_wday=4, tm_yday=116, tm_isdst=0)
    """
    return time.localtime(timestamp)

def timetuple_to_timestamp():
    """
    时间元组转换为时间戳
    :return: 时间戳:1556273828.0
    """
    # 获取当前时间元组
    tuple = time.localtime()
    return time.mktime(tuple)

timestamp_to_timetuple()输出结果:time.struct_time(tm_year=2019, tm_mon=4, tm_mday=26, tm_hour=17, tm_min=4, tm_sec=4, tm_wday=4, tm_yday=116, tm_isdst=0)
timetuple_to_timestamp()输出结果:1556273828.0

三. UTC

1. 获得当前的utc标准时间

import datetime

def get_utc():
    """
    获得当前的utc标准时间
    :return: 2019-04-26 16:04:30.196205
    """
    return datetime.datetime.utcnow()

def get_ISO_utc():
    """
    获取当前utc时间的ISO格式
    :return: 2019-04-26T16:04:30.196441
    """
    return datetime.datetime.utcnow().isoformat()

def get_ISO_utc_2():
    """
    获取当前utc时间的ISO格式:utc_format='%Y-%m-%dT%H:%M:%S'
    :return: 2019-04-26T16:04:30
    """
    return str(datetime.datetime.utcnow().isoformat())[0: -7]

2. utc时间和格式化时间相互转换

import time
import datetime
import pytz


def utc_to_formattime(utc, utc_format='%Y-%m-%dT%H:%M:%S'):
    """
    utc转换为格式化时间
    :param utc:
    :param utc_format:
    :return:
    """
    # 定义本地时区
    local_tz = pytz.timezone('Asia/Shanghai')

    # 将utc时间的格式转化为datetime.datetime格式
    utc_dt = datetime.datetime.strptime(utc, utc_format)

    # 将datetime格式添加上世界时区,然后astimezone切换时区:世界时区==>本地时区
    local_dt = utc_dt.replace(tzinfo=pytz.utc).astimezone(local_tz)

    # 转换为时间元组
    timetuple = local_dt.timetuple()

    # 转换为时间戳
    timestamp = int(time.mktime(timetuple))

    return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp))


def formattime_to_utc():
    """
    格式化时间转换为utc时间
    :return:
    """
    # 获取当前时间
    formattime = time.strftime("%Y-%m-%d %H:%M:%S")

    # 转换为时间戳
    timestamp = time.mktime(time.strptime(formattime, '%Y-%m-%d %H:%M:%S'))

    return datetime.datetime.utcfromtimestamp(timestamp).isoformat()

3. utc时间和时间元组相互转换

import time
import datetime
import pytz


def timetuple_to_utc():
    """
    时间元组转换为utc时间
    :param timestamp:
    :return: 2019-04-26 16:12:58
    """
    tuple = time.localtime()
    timestamp = time.mktime(tuple)
    return datetime.datetime.utcfromtimestamp(timestamp).isoformat()


def utc_to_timetuple(utc, utc_format='%Y-%m-%dT%H:%M:%S'):
    """
    utc时间转换为时间元组
    :param utc: utc时间
    :param utc_format: utc时间格式
    :return:时间元组:time.struct_time(tm_year=2019, tm_mon=4, tm_mday=28, tm_hour=13, tm_min=35, tm_sec=7, tm_wday=6, tm_yday=118, tm_isdst=0)
    """

    # 定义本地时区
    local_tz = pytz.timezone('Asia/Shanghai')

    # 将utc时间的格式转化为datetime.datetime格式
    utc_dt = datetime.datetime.strptime(utc, utc_format)

    # 将datetime格式添加上世界时区,然后astimezone切换时区:世界时区==>本地时区
    local_dt = utc_dt.replace(tzinfo=pytz.utc).astimezone(local_tz)

    return local_dt.timetuple()

四. DST

1. 检查当前时间是否为夏令时

def check_dst():
    """
    检查当前时间是否为夏令时
    :return:True:当前时间是夏令时;False:当前时间不是夏令时
    """
    import time
    return bool(time.localtime().tm_isdst)

五. 格式化日期

1. 获取当前时间

def get_now_time_1():
    """
    方式一:获取当前时间
    :return:
    """
    import time
    return time.strftime("%Y-%m-%d %H:%M:%S")

def get_now_time_2():
    """
    方式二:获取当前时间
    :return:
    """
    import time
    return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))

def get_now_time_3():
    """
    方式三:获取当前时间
    :return:
    """
    import datetime
    return datetime.datetime.today()

def get_now_time_4():
    """
    方式四:获取当前时间
    :return:
    """
    import datetime
    return datetime.datetime.now()

def get_now_time_5():
    """
    方式四:获取当前时间的前一个小时和后一个小时
    :return:
    """
    import datetime

    # 前一个小时
    t1 = (datetime.datetime.now() - datetime.timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S")
    
    # 后一个小时
    t2 = (datetime.datetime.now() - datetime.timedelta(hours=-1)).strftime("%Y-%m-%d %H:%M:%S")
    
    return t1, t2

2. 获取距离当前日期的指定时间的日期

def get_specified_date(days: int):
    """
    获取距离当前日期的指定日期
    :param days: 日期间隔
    :return:
    """
    import datetime
    today = datetime.date.today()

    return (today + datetime.timedelta(days=days)).strftime("%Y-%m-%d")

获取明天的日期:get_specified_date(1)
获取昨天的的日期:get_specified_date(-1)

除此之外,timedelta()方法还可以获取指定如下时间间隔的日期:

days: float = ..., 
seconds: float = ...,
microseconds: float = ...,
milliseconds: float = ..., 
minutes: float = ..., 
hours: float = ...,
weeks: float = ...

3. 计算日期时间差

from dateutil.parser import parse

def get_time_between(start_time: '%Y-%m-%d %H:%M:%S', end_time: "%Y-%m-%d %H:%M:%S"):
    """
    计算两个日期之间的相差天数和总秒数
    :param start_time: 
    :param end_time: 
    :return: 
    """

    days = (parse(start_time) - parse(end_time)).days
    total_seconds = (parse(start_time) - parse(end_time)).total_seconds()

    return days, total_seconds

六. 时间元组

1. 获取当前时间元组

import time

def get_timetuple():
    """
    获取当前时间元组
    :return:time.struct_time(tm_year=2019, tm_mon=4, tm_mday=26, tm_hour=18, tm_min=21, tm_sec=40, tm_wday=4, tm_yday=116, tm_isdst=0)
    """
    return time.localtime()

输出结果:time.struct_time(tm_year=2019, tm_mon=4, tm_mday=26, tm_hour=18, tm_min=21, tm_sec=40, tm_wday=4, tm_yday=116, tm_isdst=0)

2. 时间元组和字符串相互转换

import time

def timetuple_to_str():
    """
    时间元组转换为字符串
    :return: 2019年04月26日 18时27分03秒
    """
    tuple = time.localtime()
    return time.strftime("%Y{y}%m{m}%d{d} %H{h}%M{m1}%S{s}", tuple).format(y="年", m="月", d="日", h="时", m1="分", s="秒")

def str_to_timetuple():
    """
    字符串转换为时间元组
    :return: time.struct_time(tm_year=2018, tm_mon=4, tm_mday=26, tm_hour=18, tm_min=27, tm_sec=3, tm_wday=3, tm_yday=116, tm_isdst=-1)
    """
    return time.strptime("2018年04月26日 18时27分03秒", "%Y{y}%m{m}%d{d} %H{h}%M{m1}%S{s}".format(y="年", m="月", d="日", h="时", m1="分", s="秒"))

timetuple_to_str()输出结果:2019年04月26日 18时27分03秒
str_to_timetuple()输出结果:time.struct_time(tm_year=2018, tm_mon=4, tm_mday=26, tm_hour=18, tm_min=27, tm_sec=3, tm_wday=3, tm_yday=116, tm_isdst=-1)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容