专栏首页人云亦云一个由JS时间引发的

一个由JS时间引发的

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Zookeeper部署与动态扩容

    最近在一直维护以前的一个实时计算的系统,用到了很多有关storm、kafka、zookeeper之类的知识。自己也一直在学习这些系统的架构、源码。

    gaofc
  • Zookeeper动态扩容详细步骤

    gaofc
  • Chef

    gaofc
  • 驱动力来自哪里-献给迷茫的程序员

    一种是生存本能带来的驱动力,即生物性驱动力。比如每天要吃饭、睡觉、上厕所,长大了要恋爱、结婚等。这种驱动力保证我们能够生存在这个世界上,是一种原...

    哲洛不闹
  • GTRD:最全面的人和小鼠转录因子chip_seq数据库

    GTRD从SRA, GEO, ENCODE等公共数据库中收集转录因子相关的chip_seq数据,采用标准流程进行peak calling分析,并基于已有的转录因...

    生信修炼手册
  • JMeter分布式压测环境搭建

    在使用JMeter进行压测时,当被测接口需要很高的并发量,或者有些接口访问数很高的时候,Linux网络相关的内核参数需要根据实际服务进行调整,从而导致本地端...

    软测小生
  • JMeter分布式压测环境搭建

    在使用JMeter进行压测时,当被测接口需要很高的并发量,或者有些接口访问数很高的时候,Linux网络相关的内核参数需要根据实际服务进行调整,从而导致本地端...

    用户5521279
  • Android 开源-分享一个聊天应用

    这几个月断断续续地写了一个Android平台下的聊天应用,后台服务使用的是腾讯云通信,客户端则由自己来开发,具备了私聊和群聊功能,可以发送文本消息和表情图,我为...

    叶应是叶
  • nodejs Error: request entity too large解决方案

    错误如图: ? 解决方案: app.js添加 var bodyParser = require('body-parser'); app.use(bodyPars...

    Java中文社群_老王
  • 干货 | 基于特征的图像配准用于缺陷检测

    经典的特征匹配算法有SIFT、SURF、ORB等,这三种方法在OpenCV里面都已实现。SURF基本就是SIFT的全面升级版,有 SURF基本就不用考虑SIFT...

    OpenCV学堂

扫码关注云+社区

领取腾讯云代金券