原创文章,转载请保留此文链接 https://blog.csdn.net/flygfch/article/details/88187751,或访问本人博客 http://fangchao.me/2015/11/06/js-date.html
Background
最近在做有关游戏交易对账的一些工作,主要就是写一些Python,部署在内部LZ上,虽然每个游戏不一样,表结构也不一样,但是对账的逻辑是相似的,游戏日志表结构也十分相似。于是就有了个想法,根据一些参数自动化生成这个对账用的Python代码。
于是花了一天时间,写了几个Shell脚本,再加测试,可正常运行。再后来就又有了个想法,不如做一个平台,在前台页面输入参数,在后台执行相关脚本,生成代码,再返回前台供下载。于是又花了几天时间,用Node.JS写了一个网站,部署在内网上。
其实这不是今天想写的内容,这是背景。是不是很长。其实主要是记录一下自己最近在干什么。
今天想写的是下面这个。
Question
在做这个平台的过程中有一个功能。在写Hive之类的SQL的时候,需要有一个时间参数,而这个时间必须是昨天,也就是今天的前一天。因为今天的数据还在运行中,而昨天的数据是完整的,而且是最新的,比较有利于结果。
因为使用的是Node.JS,所以基本使用JavaScript的语法。
怎么才能得道昨天的日期呢。比如今天是2015年11月6日,我最终想要的其实是 20151105 这样的字符串。看起来很简单,做的时候就头疼了。获得今天的时间很容易。下面的语句就可以轻松获得。
new Date().toLocaleDateString();
返回 2015-11-06
。
虽然跟我要比较接近,但是
- 格式不一样
- 我需要的是昨天
查了一下,其实JavaScript提供了一些方法,可以取得取得年、月、日。比如
var myDate = new Date();
myDate.getYear(); //获取当前年份(2位)
myDate.getFullYear(); //获取完整的年份(4位,1970-????)
myDate.getMonth(); //获取当前月份(0-11,0代表1月)
myDate.getDate(); //获取当前日(1-31)
myDate.getDay(); //获取当前星期X(0-6,0代表星期天)
First Try
于是有了第一个想法,关于格式的问题,先取得年月日,组合起来就可以了。关于昨天的问题,在日这块减去1就可以了。但是比较麻烦的是
- 如果这个值是1,就得考虑月份,比如11月1日,减去1就是10月31。
- 如果月份是1,就得考虑年,比如2015年1月1日,减去1就是2014年12月31日。
- 如果月份是3,就比较蛋疼了,减去1是2月,还得考虑是否是闰年。摔!!!!
所以我得去判断月份、年份,然后再根据古训:
一三五七八十腊,三十一天永不差。四六九冬三十天,平年二月二十八,闰年还要把一日加。
把这些规则都考虑进去,就可以得到昨天的数据了。
其他还有一些小细节,比如JS里面getMonth()这个方法得到的是月份-1,这是小事,给它加上1就OK了嘛!还有,如果得到的是小于10的数,比如3,还得把它转换成03。这样才能拼凑起我想要的格式。
考虑了这么多,你以为我要写了么!!!怎么可能!!!让我做这么多事!!!我就想得到昨天的日期而已!!!
Second Try
于是觉得这样做不太靠谱,有了第二个想法,要不用一下开源库算了,网上找了找,还真不少,Moment.js,Datejs 等等还真多,后来想想还是算了,这么简单的功能,再去用别人的库实在是大材小用,还是自己再想想。
Third Try
其实总的来说只需要做两件事
- 得到昨天的日期
- 转换成我想要的格式
一个一个解决吧。得到昨天的日期,显然刚才那个方法实在是太麻烦了。看了看JS关于日期的方法,显然并没有类似于得到昨天的日期这种方法。后来发现有一种得到当前时间戳的方法getTime()
,能返回1970年1月1日至今的毫秒数。于是我用这个时间戳减去24*60*60*1000,这不就是昨天的时间么!然后我再new Date()的时候把这个时间戳传过去,再使用toLocaleDateString()
这个方法不就可以得到昨天的时间了么!当初想到这个方法真是欣喜。真的得到了想要的日期2015-11-05
。后来发现还有另一种方法
var myDate=new Date()
myDate.setDate(myDate.getDate()-1)
可以用这种方法得到,如果增加或者减少天数会改变月份或者年份,日期对象会自动完成这种转换。非常方便。
Second Problem
第一个问题解决了,再就是第二个问题了。
本以为又是很简单,使用一下.format("%Y%m%d")
之类的应该就可以了,结果发现JS里面并没有类似于format这中方法!很头疼,难道又要取得年月日再组合起来么。百度了一下无果,于是就只能Google了,点开搜索结果第一个
stackoverflow。
当时看到这个答案真的是兴奋异常加豁然开朗。把得到的字符串自己处理一下不就行了,还用什么format!
不禁感概 这才是真的大智慧啊!
我又想到了知乎上的那个回答。
Again:这才是真的大智慧啊!
Problem solved
其实是一件很小的事,但是想记录一下。
有时候自己的思维方式会受到局限,不能很好的跳出来看问题,导致有些很简单的问题使用了很复杂的方法。这是对自己的一个启示吧,尽量去打开大脑,扩展思维,使用不同的角度,不同的方法去看待问题,有时候会豁然开朗。