平时做数据分析统计跑程序脚本需呀经常用到各种时间的转化和传入,日期的格式化,日期的相减,字符串时间互转。每次都是现查,比较浪费时间,这里把平时常用到的总结一下,因为涉及到好几个脚本语言的时间函数,我也记不住,干脆整理出一个查表更方便。主要涉及到Shell,Python,MySQL,Hive这几个脚本
Shell
Shell感觉是最生涩的,最恶心的就是空格不能多也不能少,也没个IDE命令提示啥的,用的也最少,所以老容易忘
1 2 3 4 5 6 7 8
| $ date 以默认格式显示当前日期(Fri Nov 18 10:38:07 CST 2011) $ date +%Y%m%d 以yyyymmdd格式输出(20160423) $ date +"%Y%m%d %A" 以"yyyymmdd 星期"格式输出(20160423 Friday) $ date -d "1 day" +%Y%m%d 显示一天后的日期(20160424) $ date -d "3 day ago" +%Y-%m-%d 以指定格式显示3天前的日期(2016-04-26) $ date -d "1 month" +%Y-%m-%d 以指定格式显示一个月后的日期 $ date -d "1 month" +%s 以指定格式显示一个月后的日期的秒数,%S为当前的秒数(0~59) $ date -d "1970-01-01 CST 1 second" +%s 显示从1970-01-01 CST起1秒后的秒数
|
1 2 3 4
| $ date -d "-2 day 20160423" +%Y%m%d 20160421 $ date -d "+7 day 20160423" +%Y%m%d 20160430
|
这个场景还是很常用的,一般脚本都是默认跑当天或者前一天的数据,如果要一次重跑每一天的数据,可能就需要用到Shell日期循环:
1 2 3 4 5 6 7 8
| begin_date='20160401' end_date='20160423'
while [ "$begin_date" != "$end_date" ] do echo $begin_date begin_date=`date -d "1 day $begin_date" +%Y%m%d` done
|
**注意:**一定要用""
把条件扩起来,!=
史比较字符串的。
Python
Python里用的比较多的就是两个包datetime
,time
1 2 3 4 5 6 7 8 9
| datetime.datetime.now().strftime('%Y-%m-%d') str(datetime.datetime.now())[:10] (datetime.datetime.now() + datetime.timedelta(days=-1)).strftime('%Y-%m-%d') datetime.datetime.strptime('2016-04-23', '%Y-%m-%d') (d1 - d2 ).days (d1 - d2 ).seconds datetime.weekday() datatime.isoweekday() datetime.fromtimestamp(timestamp)
|
- time
1
| time.strftime('%Y-%m-%d %H:%M:%S') # 格式化输出当前时间
|
MySQL
主要是一些时间转换函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| mysql> select unix_timestamp('2016-01-01 10:10:10'); +---------------------------------------+ | unix_timestamp('2016-01-01 10:10:10') | +---------------------------------------+ | 1451614210 | +---------------------------------------+ 1 row in set (0.01 sec)
mysql> select from_unixtime(unix_timestamp()); +---------------------------------+ | from_unixtime(unix_timestamp()) | +---------------------------------+ | 2016-06-18 13:07:53 | +---------------------------------+ 1 row in set (0.00 sec)
|
Hive
1 2 3
| to_date('2016-04-23') # 2016-04-23 to_date('2016-04-23 12:21:10') # 2016-04-23 datediff(end_time, start_time) # 返回日期相隔天数
|