坑人的toLocaleDateString和简单地跳坑方式
最近在做一个一个医学大数据的项目的时候,独立设计、构思、制作了完成了一个生命历程图的功能。既然设计到时间,那就免不了对Date对象进行一系列的操作,也就免不了对日期对象进行一系列的格式化。走的路多了,难免遇到坑。其中toLocaleDateString就是一个天坑。
今天,上司和我说:“阿伦啊,你那个小卡片领导有点不满意啊,你再研究一下。”于是乎,我就开始了和UI的深入浅出地研究,最终定下了一版,我成功地把他实现了。当时我就跑到项目组每个人的电脑前让他们瞅瞅,我当时的想法是这样的:

但是,等等?what?纳尼?(⊙o⊙)?我在项目组数据分析师的电脑上看到了惊悚的一幕,类似这样的:

我有跑回去瞅了一下我的电脑,依旧完美地运行着。那么问题是什么呢?打开数据分析师的浏览器控制台,发现了一个报错“Unable to get property ‘mouths’ of undefined or null refernce”,虽然我属于英语困难户类型的,但是这句话也能猜个八九不离十,大概就是这个属性没找到。我分别对其上一层对象进行了打印,结果在我这里正常,在同事那里就是undefind。那么问题就来了,数据分析师使用的是搜狗浏览器,而博主使用的是chrome浏览器。因此,很可能是兼容的问题。于是乎,博主继续向上级打印。发现有一个数据dateEnd在我这里为“2018/3/2”,在同事那里是“2018年3月2日”。原因找到了,我在对这个数据进行处理的时候使用了字符串转数组的split('/'),但是问题是‘2018年3月2日’并没有“-”,所以只能被转换成了length为1的['2018年3月2日'],因此无法进行下一步处理了。
我研究了一下搜狗浏览器,发现其和360浏览器差不多,都有兼容模式和极速模式。兼容模式是使用了ie的内核,极速模式使用了webkit内核。而这个项目暂时是用ip地址登陆的,所以无意间触发了ie的Trident内核,因此引发了某些兼容问题。
找到问题后,博主查看了一下这个日期数据的来源,发现是一个代码"new Date().toLocaleDateString()",即对当前的额日期数据进行格式化。于是乎,我分别在chrome浏览器和ie浏览器打印了一下,得到的结果分别是"2018/3/2"和"2018年3月2日"。
博主去MDN查找相关属性,结果发现了这样一段话“toLocaleDateString() 方法返回该日期对象日期部分的字符串,该字符串格式因不同语言而不同。新增的参数 locales 和 options 使程序能够指定使用哪种语言格式化规则,允许定制该方法的表现(behavior)。在旧版本浏览器中, locales 和 options 参数被忽略,使用的语言环境和返回的字符串格式是各自独立实现的。”貌似以前错过了什么,居然还有参数。也就是说不配置参数的话可能结果会随着浏览器的变化而变化。
经过测试,楼主发现在不同的浏览器结果是这样的:
# firefox
> new Date().toLocaleDateString()
> "2017/5/12" #IE11
> new Date().toLocaleDateString()
> "2017-5-12" #Chrome
> new Date().toLocaleDateString()
> "2017/5/12" #Edge
> new Date().toLocaleDateString()
> "2018年3月2日"
我只是想静静地处理一下日期,你却这么对我,我选择toLocaleDateString() 狗带。
于是,我就随便写下了`/${new Date().getFullYear()}/${new Date().getMonth()}${new Date().getDate()}`。OK,收工。
生命在于折腾,完成项目之后,我用正则和简单的方法写了一个小的方法作为下次在遇到时的对策:
var Format = function(date, rule) {
this.time = date ? date : (new Date());
this.rule = rule;
if (this.rule) {
this.standard()
}
}
Format.prototype.standard = function() {
let date = new Date(this.time)
if (date == 'Invalid Date') {
let reg1 = /^(\d{3,6}年)?\d{1,2}月(\d{1,2}日)?$/g,
reg2 = /^\d{1,2}月(\d{1,2}日)?(\d{1,6}年)?$/g,
reg3 = /^(\d{1,2}日)?\d{1,2}月(\d{1,6}年)?$/g,
reg4 = /^\d{3,6}年$/;
if (this.time.match(reg1)||this.time.match(reg2)||this.time.match(reg3)||this.time.match(reg4)){
let timeRule
= new Date(`${(this.time.match(/\d{3,6}年/g))?(this.time.match(/\d{3,6}年/g)[0].replace(/年/g,'')
.split('').reverse().concat([0,0,0,0,0,0]).reverse().slice(2).join(''))+'-':''}`
+`${(this.time.match(/\d{1,2}月/g))?(this.time.match(/\d{1,2}月/g)[0].replace(/月/g,''))+'-':''}`
+`${(this.time.match(/\d{1,2}日/g))?(this.time.match(/\d{1,2}日/g)[0].replace(/日/g,'')):''}`);
return timeRule == 'Invalid Date' ? '请输入正确的日期数字' : timeRule
} else {
return '请输入正确的日期,如2000年1月1日、2000-1-1或2000/1/1'
}
} else {
this.time = new Date(this.time)
return this.time
}
}
Format.prototype.change = function() {
if (!this.rule) {
return this.standard()
} else if (this.rule == 'chinese' || this.rule == 'line' || this.rule == 'slash') {
let date = new Date(this.standard()).toDateString().split(' ');
var month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dece"];
for (var i = 0; i < month.length; i++) {
if (date[1] == month[i]) {
date[1] = i + 1
}
}
if (this.rule == 'chinese') {
return `${Number(date[3])}年${Number(date[1])}月${Number(date[2])}日`
} else if (this.rule == 'line') {
return `${Number(date[3])}-${Number(date[1])}-${Number(date[2])}`
} else {
return `${Number(date[3])}/${Number(date[1])}/${Number(date[2])}`
}
} else {
return '请输入正确的格式化参数:chinese、line或slash'
}
}
调用的方法为:
new Format('2011年10月1日').standard()
//Sat Oct 01 2011 00:00:00 GMT+0800 (中国标准时间)
new Format('Sat Oct 01 2011 00:00:00 GMT+0800 (中国标准时间)', 'line').change()
//2011-11-1
new Format('Sat Oct 01 2011 00:00:00 GMT+0800','chinese').change()
//2011年11月1日
new Format('Sat Oct 01 2011 00:00:00 GMT+0800','slash’).change()
//2011/11/1
new Format('2011-11-1').change()
//Sat Nov 01 2011 00:00:00 GMT+0800 (中国标准时间)
如果您觉得我的博文有用,请不要吝啬您的赞和关注。如需转载,请标明出处,谢谢。
坑人的toLocaleDateString和简单地跳坑方式的更多相关文章
- JavaScript 跳坑指南
JavaScript 跳坑指南 坑0-String replace string的replace方法我们经常用,替换string中的某些字符,语法像这样子 string.replace(subStr/ ...
- [转帖]Kubernetes - nginx-ingress 配置跳坑指南
Kubernetes - nginx-ingress 配置跳坑指南 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https:// ...
- CGAL代码阅读跳坑指南
CGAL代码阅读跳坑指南 整体框架介绍 CGAL中的算法和数据结构由它们使用的对象类型和操作参数化.它们可以处理满足特定语法和语义需求的任何具体模板参数.为了避免长参数列表,参数类型被收集到一个单独的 ...
- Xamarin安装和跳坑指南
安装Checklist 注意:本文只描述安装过程,由于组件的版本更新很快,为保证文章时效性,不提供下载链接,也尽可能不指明具体版本. 安装Visual Studio 2015进行默认安装,除非已经FQ ...
- 纯JSP实现简单登录跳转
1.JSP介绍 JSP即Java Server Pages,JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑.网页还能通过tags和script ...
- 【模拟,时针分针秒针两两夹角】【没有跳坑好兴奋】hdu - 5387 (多校#8 1008)
算是最好写的一道题了吧,最近模拟没手感,一次过也是很鸡冻o(* ̄▽ ̄*)o 注意事项都在代码里,没有跳坑也不清楚坑点在哪~ #include<cstdio> #include<cst ...
- 两百条微信小程序跳坑指南(不定时更新)
微信小程序联盟出品 跳坑textarea<二百二十三>不显示文本及textarea相关问题集合跳坑<二百一十三> background-image无法获取本地资源图片....跳 ...
- 小程序红包开发跳坑记 微信小程序红包接口开发过程中遇到的问题 微信小程序红包开发
现在做小程序的越来越多,商家推广也是一个瓶颈,谁不发点红包,都很难找到人来用你的微信小程序了.于是不管你开发什么小程序功能,你或多或少都要用到小程序来发红包吧. 我们自己之前做公众号发红包,做了两三 ...
- ACM_跳坑小能手(暴力)
跳坑小能手 Time Limit: 2000/1000ms (Java/Others) Problem Description: GDUFE-GAME现场有一个游戏场地人头窜动,围观参与游戏的学生在场 ...
随机推荐
- ORACLE约束总结
你对ORACLE约束的了解如何?比较模糊还是相当透彻?如果你对下面几个问题了如指掌的话,恭喜你,你已经对约束掌握得比较好了,不用看这篇文章了.ORACLE的约束有啥功能作用? 有哪些类型约束(不同版本 ...
- golang变量作用域问题-避免使用全局变量
最近遇到了一个变量作用域的问题,一个比较低级的问题,可能作为一个熟手不应该犯这样的低级错误,但是golang的语法特点可能让你稍微不注意就踩坑,嘿嘿. 变量作用域 全局变量的作用域是整个包,局部变量的 ...
- 搭建内网的NTP时间服务器
NTP时间服务器 标签: linux 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 1.简介 NTP(Network Time Protocol,网络时间协议) ...
- 使用locate 的正则查询 查找所有main.c
locate支持正则查询的功能, 只需输入locate -r 正则表达式 即可. 现在我想查找所有main.c怎么做? 打开终端,输入shell: locate -r main.c$ PS:' ...
- spring boot + vue + element-ui全栈开发入门——前端列表页面开发
一.页面 1.布局 假设,我们要开发一个会员列表的页面. 首先,添加vue页面文件“src\pages\Member.vue” 参照文档http://element.eleme.io/#/zh-CN ...
- git stash暂存文件
git stash 可用来暂存当前正在进行的工作, 比如想pull 最新代码,但又不想提交代码.先git stash暂存,pull之后,用git stash pop或者git stash apply取 ...
- BZOJ 1025: [SCOI2009]游戏 [置换群 DP]
传送门 题意:求$n$个数组成的排列变为升序有多少种不同的步数 步数就是循环长度的$lcm$..... 那么就是求$n$划分成一些数几种不同的$lcm$咯 然后我太弱了这种$DP$都想不出来.... ...
- SPOJ 7258 Lexicographical Substring Search [后缀自动机 DP]
题意:给一个长度不超过90000的串S,每次询问它的所有不同子串中,字典序第K小的,询问不超过500个. 第一道自己做的1A的SAM啦啦啦 很简单,建SAM后跑kth就行了 也需要按val基数排序倒着 ...
- OPP面向对象的介绍及使用
概述 面向过程与面向对象面向过程:专注于如何去解决一个问题的过程,编程特点是用一个个函数去实现过程操作,没有类与对象的概念面向对象:专注于有哪一个对象实体去解决这个问题,编程特点是:出现了一个个的类, ...
- 小甲鱼OD学习第1讲
这一讲我们的目标是修改Hello.exe对话框的标题和内容,如图所示 把程序放进OD,按F8一步步运行,直到程序弹出对话框为止,然后在弹出对话框位置处下断点 按Ctrl+F2重新载入程序,然后按F9直 ...