前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个由JS时间引发的

一个由JS时间引发的

作者头像
gaofc
发布2018-05-09 17:41:34
2.2K0
发布2018-05-09 17:41:34
举报
文章被收录于专栏:人云亦云人云亦云

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Background
  • Question
  • First Try
  • Second Try
  • Third Try
  • Second Problem
  • Problem solved
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档