Python3教程:在python/Shell/MySQL中时间获取与格式转换的方法总结
时间的获取及时间各格式间的转换是比较常用的操作,但一是多种语言经常容易弄混,二是同一种语言同一个功能可能有不同的实现函数,导致每次处理时间经常要百度所以来记录一下。
另外个人真不喜欢同样功能有多种写法的形式,从理想角度说多种实现方式让不同的人都能以其喜欢的方式进行编写;但实际上当你忘记的时候,你就总要怀疑是不是这么写、可不可以这么写、到底怎么写,然后到网上看又是五花八门的写法,这是个很耗费精力的事情。这也是我不喜欢Ruby的原因。
一、Python时间操作
1 获取时间对象
import time
import datetime
# 获取当前时间对象
# 返回形如datetime.datetime(2020, 2, 29, 10, 34, 36, 799216)对象
# 可通过对象的year、month、day、hour、minute、second、microsecond、tzinfo等属性获取各部分的信
datetime.datetime.now()
datetime.datetime.today()
# 获取昨天时间对象。当前时间减去一天的时间差即可
# 接受参数weeks,days,hours,seconds,minutes,microseconds,milliseconds,且可同时使用
# 返回形如datetime.datetime(2020, 2, 28, 10, 37, 31, 470867)
datetime.datetime.now() - datetime.timedelta(days=1)
# 获取明天时间对象。当天的时间加上一天的时间差即可
# 接受参数weeks,days,hours,seconds,minutes,microseconds,milliseconds,且可同时使用
# 返回形如datetime.datetime(2020, 3, 1, 10, 37, 31, 470867)
datetime.datetime.now() - datetime.timedelta(days=1)
2 时间对象与给定格式转换
import time
import datetime
# 时间对象输出成指定格式
# 输出形如2020-02-29 11:03:29(-空格和:等符号可以换成其他任意自己想要的字符)
obj = datetime.datetime.now()
obj.strftime("%Y-%m-%d %H:%M:%S")
obj.__format__("%Y-%m-%d %H:%M:%S")
# 给定时间转成时间对象
datetime.datetime.strptime("2020-02-29 11:03:29", "%Y-%m-%d %H:%M:%S")
3 时间对象与时间戳转换
import time
import datetime
# 时间对象转成时间戳
# 结果形如1582943851.470867
obj = datetime.datetime.now()
obj.timestamp()
# 时间戳转成时间对象
datetime.datetime.fromtimestamp(time.time())
4 时间的比较
import time
import datetime
# 单纯地比较大小可以直接比较。
# 执行太快了两个对象是一样的,所以睡眠一下
obj_a = datetime.datetime.now()
time.sleep(1)
obj_b = datetime.datetime.now()
if obj_b > obj_a:
print("yes")
# 要获取具体时间差,可将转成时间戳再相减
obj_a = datetime.datetime.now()
time.sleep(1)
obj_b = datetime.datetime.now()
if obj_b > obj_a:
late = obj_b.timestamp() - obj_a.timestamp()
print(f"obj_b is late than b: {late}")
二、Shell时间操作
1 基础操作
# 获取当前时间,并输出成指定格式
# 有引号是因为有空格,没有空格用不用引号都一样
date +"%Y-%m-%d %H:%M:%S"
# 获取昨天时间,并输出成指定格式
date -d "yesterday" +"%Y-%m-%d %H:%M:%S"
date -d "last-day" +"%Y-%m-%d %H:%M:%S"
date -d "1 day ago" +"%Y-%m-%d %H:%M:%S"
date -d "-1 days" +"%Y-%m-%d %H:%M:%S"
# 获取明天日期,并输出成指定格式
date -d "tomorrow" +"%Y-%m-%d %H:%M:%S"
date -d "next-day" +"%Y-%m-%d %H:%M:%S"
date -d "+1 days" +"%Y-%m-%d %H:%M:%S"
# 将给定日期输出成指定格式
date -d "2020-07-22 09:09:09" +"%H:%M:%S %Y-%m-%d"# 将timestamp转成指定日期格式date -d @1640162812 +"%Y-%m-%d %H:%M:%S"
2 date月份设置成中/英文问题
%b表示以系统所设置语言的月份简写,如"Aug";%B当地语言全称,如"August"。
但这个“系统设置语言”到底是由哪个配置设置呢?之前以为是LANG,LANG设置成"zh_CN.UTF-8"就是中文,date +"%b"就会输出“8月”;设置成"en_US.UTF-8"就是英文,date +"%b"就会输出“Aug”。
之前也收到反馈说LANG设置成了"en_US.UTF-8",date +"%b"仍输出中文“8月”,并不太上心,但今天自己也遇到了这个情况。
通过查找资料和实验,发现环境变量的优先级是LC_ALL > LC_*(包括决定月分显示语言的LC_TIME)> LANG。所以当LC_ALL设置成"zh_CN.UTF-8"时去设置LANG为"en_US.UTF-8",date +"%b"仍输出中文。
# 月份以英文形式输出。%b缩写,%B全称
LC_ALL=C date -d "2020-07-22 09:09:09" +"%b"
# 查看各影响编码的环境变量的当前值
locale
# 查看系统支持的全部编码
locale -a
三、MySQL时间操作
1 MySQL获取时间
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 获取当天日期
select curdate();
获取昨天日期
select date_sub(curdate(),interval 1 day);
获取明天日期
select date_sub(curdate(),interval -1 day);
# 获取当前时间
select now();
# 获取一个小前时间
select date_sub(now(),interval 1 hour);
# 获取一个小时后时间
select date_sub(now(),interval -1 hour);
# 获取昨天时间
select date_sub(now(),interval 1 day);
# 获取明天时间
select date_sub(now(),interval -1 day);
2 时间输出成指定格式
# 当前时间输出成给定格式
select date_format(now(),"%Y%m%d %H:%i:%S");
# 给定时间输出成指定格式
select date_format(date_sub(curdate(),interval 1 day),"%Y%m%d");
select date_format(date_sub(now(),interval 1 hour),"%Y%m%d %H:%i:%S");
3 获取时间戳
select unix_timestamp(now());
四、附Python时间格式
Python、Shell、MySQL之间格式虽然大多是相同的,但小部分还是有区别,自己使用时要注意。比如分钟Python和Shell是"%H",但MySQL是"%i"。