在写脚本的时候,经常需要处理日期。而处理工具主要用到两个,一个是shell,一个是python。下面我们来看看在shell和python中,怎么将日期和天数进行转换。
工具/原料
shell
python3
一、shell方式
1、首先我们来看一下shell中的日期转换,主要有两种转换方式,第一种是给出一个日期,转换为需要的格式。我们来看。在shell中转换日期使用的命令是date,date命令的基本格式是:date [选项] +[格式]选项指的是参数,常用的是-d选项格式指的是你要格式化的日期格式。比如2018-07-31这样的。是通过格式化字符来控制的。下面我们看一个示例:
2、在上面的示例中,now表示当前时间,跟在-d选项后面。此外还有一些的特殊变量,例如鲻戟缒男yesterday,tomorrow,前者表示昨天,后者表示明天。剧安颌儿如第一张图中所示。但是在-d后面最常用的还是日期字符串。例如'20150803'、'2018-08-03',最常用且最方便的就是这两种格式。+'%Y-%m-%d'就是格式化使用的字符串,%Y表示年,%m表示月,%d表示日。基本格式了解清楚了以后,格式化就简单了。在工作中经常遇到的就是将%Y%m%d格式和'%Y-%m-%d'格式的日期来回转换。那么根据它的要求,我们就可以写出下面第二张图中所示的示例:
3、日期之间的格式互转了解了以后,我们来了解一下第二个常用的转换,就是把日期转为天数,以及把天数转为日期。先看日期转天数。如下面所示,在date的帮助文档中,我们看到,表示天数的格式化字符串是%j,如下面图中所示:
4、然后就可以根据对应的格式化字符串,将日期转换成一年中的天数,如下面第一张图中的示例,两种格式的字符串,可以直接转换,再看第二张图中的示例,2012年和2018年一个是闰年,一个是非闰年,结果也都是对的。
5、但是天数转日期这个就有点难了,因为知道一个天数,还要需要知道一个年份。来判断这稍僚敉视个天数的具体日期。操作思路是,根据这一年的第一天,加上天数,再减去一,就是对应的日期了。日期加减的格式是:date -d '20180503 +1 day' +'%Y-%m-%d'在字符串后面有一个+1 day表示加1天,根据这样的格式就很容易写出根据天数推断日期的示例了。比如上面示例中的20120508对应的天数是129天,那么对应的日期反推就是:date -d '20120101 +128 day' +'%Y-%m-%d'结果如下图中所示,第二个示例中,2018年加上同样的天数就是5月9号,是因为2012年是闰年,比2018年多一天。因此即使是闰年也不会出错。
二、python模块处理
1、看完shell的处理方式以后,我们再来看python中怎么处理这个日期和天数的转换问题。在python里,我比较常用的模块是time模块,下面一起来看。首先使用导入命令导入这个模忧栝牯嚣块。然后使用time模块的strptime函数将一个日期字符串转换为一个类对象,strptime函数的格式是:strptime(string, format)format也是指的格式化字符串,和shell中的类似。但是和shell中略微不同的是,shell中根据格式化字符串确定最后的输出格式。而strptime函数是根据前面字符串格式来确定格式化字符的格式。如下面图中所示,字符是'20180508',那么格式化字符就是'%Y%m%d',转换完成以后就是类对象。
2、然后就可以从类对象中直接输出它是一年中的多少天了,如下面图中所示,使用的是类对象的一个属性tm_yday.
3、至于将天数转换为一年中的日期也是非常简单的。这次使用到的是datetime模块和deltatime模块,这个模块重载了操作符,日期类对象之间可以直接使用加减的方式操作,如下面图中所示:datetime(2018,1,1)表示2018年第一天,timedelta(128)表示第129天。然后两者相加以后,就得到一个日期对象,可以看到是2018年5月9日。和上面shell示例中的结果是一样的。