博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
移动端中踩过的关于日历&时间的坑
阅读量:7004 次
发布时间:2019-06-27

本文共 3561 字,大约阅读时间需要 11 分钟。

① 情景-在移动端日历中,选择日期并转成时间戳,在iOS端莫名失效

日历相信是大家都做过的小玩意,它有可能是HTML5自带的也可能是自己做的,同时取到的时间格式也是千奇百怪的。不废话了,我们直接上代码。

let a = Date.parse('2017-1-1');console.log(a);let b = Date.parse('2017-01-1');console.log(b);let c = Date.parse('2017-01-01');console.log(c);let a1 = Date.parse('2017/1/1');console.log(a1);let b1 = Date.parse('2017/01/1');console.log(b1);let c1 = Date.parse('2017/01/01');console.log(c1);复制代码

这些都是我们常见的时间格式,无论是从后端取得还是我们前端转换而来的。那么大家知道每个console的结果是什么吗?

let a = Date.parse('2017-1-1');console.log(a);//chrome浏览器--1483200000000//Android微信端(类Android内置浏览器)--1483200000000//iOS微信端(类Safari浏览器)--NANlet b = Date.parse('2017-01-1');console.log(b);//chrome浏览器--1483200000000//Android微信端(类Android内置浏览器)--1483200000000//iOS微信端(类Safari浏览器)--NANlet c = Date.parse('2017-01-01');console.log(c);//chrome浏览器--1483228800000//Android微信端(类Android内置浏览器)--1483228800000//iOS微信端(类Safari浏览器)--1483228800000let a1 = Date.parse('2017/1/1');console.log(a1);//chrome浏览器--1483200000000//Android微信端(类Android内置浏览器)--1483200000000//iOS微信端(类Safari浏览器)--1483200000000let b1 = Date.parse('2017/01/1');console.log(b1);//chrome浏览器--1483200000000//Android微信端(类Android内置浏览器)--1483200000000//iOS微信端(类Safari浏览器)--1483200000000let c1 = Date.parse('2017/01/01');console.log(c1);//chrome浏览器--1483200000000//Android微信端(类Android内置浏览器)--1483200000000//iOS微信端(类Safari浏览器)--1483200000000复制代码

惊不惊喜!神不神奇!iOS的浏览器是无法解析2017-1-1和2017-01-1(2017-1-01)这两类格式的日期。所以如果用童鞋们在写日历组件的时候发现安卓和iOS行为不一致的时候不妨看看日期格式那边是否存在问题。

总的来说,在移动端中使用'/'作为日期分割是最保险的,但是这一般与前端展示的期望不一,这时候就改取舍一下,是用多的代码量来提高项目容错率还是严格控制自己的日期格式...

②项目引入了"完美时间插件moment.js"但是它又粗又大...

也许有些童鞋还不太了解moment,可以点击看看它的文档。

不得不说它的功能确实很强大,基本可以满足大部分项目对时间显示或转换的各种需求,它甚至还内置了语言包,只能说功能很强大并且用途很广泛,看看GitHub上的star就大概能感受到它的地位了。

它这么好用,用起来简单粗暴,又粗又大又有什么所谓呢?

其实不然,因为你没有在项目打包之后整体的分析项目bundle的占比。如果你是用webpack构建项目的话可以选择使用webpack-bundle-analyzer来分析一下你的包体结构,如果在项目中引入了moment,你会发现它真的很大...

无论是站在项目角度还是用户角度,个人认为都不应该草率的使用如此巨大的依赖包。并且,只要我们静下来仔细分析一下我们的项目,会发现,其实我们对日期时间方面的需求并没有想象中的那么繁杂。

下面我会贴一个自己正在使用的工具类--

//用法--TimeStream(1500614243, 'CN-YMD')function TimeStream(timestamp, type) {    let date = new Date(timestamp * 1000);    let Y = date.getFullYear();    let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1);    let D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();    let h = date.getHours() < 10 ? '0' + date.getHours() : date.getHours();    let m = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes();    let s = date.getSeconds();    switch (type) {        case 'YMD': //年-月-日            return Y + '-' + M + '-' + D;        case 'MD': //月-日            return M + '-' + D;        case 'MD_HM': //月-日            return M + '-' + D + ' ' + h + ':' + m;        case 'YMD_HMS': // 月-日 时:分:秒            return Y + '-' + M + '-' + D + ' ' + h + ':' + m + ':' + s;        case 'CN_YMD': //x年x月x日            return Y + '年' + M + '月' + D + '日';        case 'CN_YMD_HM': //x年x月x日            return Y + '年' + M + '月' + D + '日' + ' ' + h + ':' + m;        case 'hm': // 时:分            return h + ':' + m;        case '-D': //天数差            return Math.floor(((timestamp * 1000) - Date.parse(new Date())) / 1000 / 3600 / 24);        case '-H': //小时差            return Math.ceil((timestamp * 1000 - Date.parse(new Date())) / 1000 / 3600);        default: //年-月-日 时:分            return Y + '-' + M + '-' + D + ' ' + h + ':' + m;    }}复制代码

这是我正在使用的自己写的有关时间的工具类,当然它与我们的项目是密切结合的(其实就我们的项目而言也只需要这几种类型的转换),并且它可以灵活的根据需求的变化而变化,用法也并不算很麻烦,只要稍作注释,任何同事都可以随心使用。

以上工具类肯定还有很多别的更优写法,我只是想借助这个解释一下为什么我不提倡盲目使用moment(可代入任何又粗又大的依赖),要知道,在这几十行代码诞生之前,我们用着的是一个Gzip过后还有几十K的依赖。

转载地址:http://knytl.baihongyu.com/

你可能感兴趣的文章
flutter环境搭建及跑起来demo(多图慎入)
查看>>
ubuntu 织梦DEDE安装 GD插件 OFF问题
查看>>
Netty-ChannelHandler-ChannelPipeline
查看>>
php 上传图片造成内存溢出 Allowed memory size of ... bytes
查看>>
[Doctrine Migrations]数据库迁移组件的深入解析一:安装与使用
查看>>
客户说网页打开白屏了,怎么办?(前端异常日志收集)
查看>>
[LintCode] Three Distinct Factors
查看>>
iOS多线程:『GCD』详尽总结
查看>>
Github pages + Minimal-Mistakes + Disqus建立个人博客记录
查看>>
CSS3属性-webkit-font-smoothing字体抗锯齿渲染
查看>>
对MVVM架构的一些理解
查看>>
Spring IOC 容器源码分析 - 创建单例 bean 的过程
查看>>
MySQL数据库1
查看>>
Android入门篇(五)Activity跳转
查看>>
每天一个lodash方法-differenceBy
查看>>
linux命令之htpasswd
查看>>
Nginx负载均衡配置
查看>>
flow的采集与分析---clickhouse的简介和安装
查看>>
cgo的指针传递
查看>>
JS 实现抛物线动画
查看>>