脚本语言时间处理函数总结

平时做数据分析统计跑程序脚本需呀经常用到各种时间的转化和传入,日期的格式化,日期的相减,字符串时间互转。每次都是现查,比较浪费时间,这里把平时常用到的总结一下,因为涉及到好几个脚本语言的时间函数,我也记不住,干脆整理出一个查表更方便。主要涉及到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秒后的秒数
  • -d这个参数可以产生各种时间组合
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

  • datetime
1
2
3
4
5
6
7
8
9
datetime.datetime.now().strftime('%Y-%m-%d')	# 2016-04-23
str(datetime.datetime.now())[:10] # 2016-04-23
(datetime.datetime.now() + datetime.timedelta(days=-1)).strftime('%Y-%m-%d') # 2016-04-22
datetime.datetime.strptime('2016-04-23', '%Y-%m-%d') # 将字符串格式为datetime对象
(d1 - d2 ).days # d1,d2 为datetime对象,计算连个日期之间相差多少天
(d1 - d2 ).seconds # d1,d2 为datetime对象,计算连个日期之间相差多少秒
datetime.weekday() # 返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推;
datatime.isoweekday() # 返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推;
datetime.fromtimestamp(timestamp) # 根据给定的时间戮,返回一个datetime对象;
  • 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) # 返回日期相隔天数