一个由JS时间引发的

原创文章,转载请保留此文链接 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.jsDatejs 等等还真多,后来想想还是算了,这么简单的功能,再去用别人的库实在是大材小用,还是自己再想想。

Third Try

其实总的来说只需要做两件事

  1. 得到昨天的日期
  2. 转换成我想要的格式

一个一个解决吧。得到昨天的日期,显然刚才那个方法实在是太麻烦了。看了看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

其实是一件很小的事,但是想记录一下。

有时候自己的思维方式会受到局限,不能很好的跳出来看问题,导致有些很简单的问题使用了很复杂的方法。这是对自己的一个启示吧,尽量去打开大脑,扩展思维,使用不同的角度,不同的方法去看待问题,有时候会豁然开朗。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值