需求:前端取后端返回的时间与当前时间进行比较展示,展示规则:

1、返回的时间跟当前时间同年同月同日 显示 今天

2、返回的时间与当前时间相差在7天以内 显示 某天前

3、返回的时间与当前时间相差大于7天 显示 yyyy-mm-dd

4、是自然日的计算。 例如:返回的时间是 2018-10-31 23:59:59  当前时间是 2018-11-01 14:38:00 (这里时间戳相减是小于24个小时) 或   返回的时间是 2018-10-31 00:00:01  当前时间是 2018-11-01 14:38:00 (这里时间戳相减是大于24个小时) 都算是一天

背景:考虑过时间戳相减计算,但是行不怎么通。如下:

function getTimeDifference(date1,date2){
date1 = new Date(date1.replace(/\-/g, "\/"));
date2 = new Date(date2.replace(/\-/g, "\/"));
var days = date2.getTime() - date1.getTime();
var time = parseInt(days / (1000 * 60 * 60 * 24));
return time;
}

分析:用上面列举的时间,放到这个函数里面计算, 第一个得到的天是0  第二个是 1 显然,第一个得到的是错误的。这里是用parseInt得到的结果取整,换成向下或向上取整都有类似的问题。

解决办法:

var lastTime = function (time) {
if (time === "无访问记录") return time;
if (typeof time === "string") {
var regexp = getRegExp('-', 'g');
time = time.replace(regexp, '/');
}
var ct = getDate(),
tt = getDate(time),
curDate = ct.getDate(),
tDate = tt.getDate(),
diff = getDate().getTime() - getDate(time).getTime(),
day = 24 * 3600 * 1000,
count = 0;
if (diff < 8 * day) {
if (curDate === tDate) {
return "今天";
}
while (tDate !== curDate) {
count++;
tt.setDate(++tDate);
tDate = tt.getDate();
}
return count + "天前";
}
return _toDate(time);
},

分析:重点在while语句里面,当然 while语句在 diff < 8 * day 条件下,就不用考虑 不同月的同一天。执行环境是小程序中的wxs中,所以用的是wxs中的方法,需要的可以更换对应的js方法。

思路来源于我另外一篇随笔:点击进入

js中自然日的计算的更多相关文章

  1. js中对小数的计算

    在js 的计算中如果涉及到小数的运算,那结果可不要想当然了,比如  0.1+0.2 的计算 var num1 = 0.1; var num2 = 0.2; console.log(num1+num2) ...

  2. js中offsetLeft,offsetTop,offsetParent计算边距方法

    封装一个函数获得任一元素在页面的位置 var GetPosition= function (obj) { var left = 0; var top = 0; while(obj.offsetPare ...

  3. JS中数值类型的本质

    一.JS中的数值类型 众所JS爱好友周知,JS中只有一个总的数值类型--number,它包含了整型.浮点型等数值类型.其中,浮点数的实现思想有点复杂,它把一个数拆成两部分来存储.第一部分是有效位数,也 ...

  4. js中如何通过身份证号计算出生日期和年龄

    在html中有如下标签 身份证号:<input type="text" id="Gra_IDCard" onChange="IDCardChan ...

  5. js中进行金额计算parseFloat

    在js中进行以元为单位进行金额计算时 使用parseFloat会产生精度问题var price = 10.99;var quantity = 7;var needPay = parseFloat(pr ...

  6. js中计算两个日期之差

    js中计算两个日期之差            var aBgnDate, aEndDate;            var oBgnDate, oEndDate;            var nYl ...

  7. js中进行金额计算

    js中进行金额计算parseFloat   在js中进行以元为单位进行金额计算时 使用parseFloat会产生精度问题var price = 10.99;var quantity = 7;var n ...

  8. js中进行金额计算 parseFloat 会产生精度问题

    在js中进行以元为单位进行金额计算时 使用parseFloat会产生精度问题 var price = 10.99;var quantity = 7;var needPay = parseFloat(p ...

  9. js中如何将字符串转化为时间,并计算时间差

    在前台页面开发时通常会用到计算两个时间的时间差,先在此附上实现方法 //结束时间 end_str = ("2014-01-01 10:15:00").replace(/-/g,&q ...

随机推荐

  1. 浅析history hack、心血漏洞、CSS欺骗、SQL注入与CSRF攻击

    漏洞产生的原因主要有系统机制和编码规范两方面,由于网络协议的开放性,目前以 Web 漏洞居多 关于系统机制漏洞的典型有JavaScript/CSS history hack,而编码规范方面的漏洞典型有 ...

  2. 标准C++常用头文件及描述

    #include <algorithm> //STL 通用算法 #include <bitset> //STL 位集容器 #include <cctype> //字 ...

  3. javascript之注册事件

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. [SPSS]如何利用spss进行单侧检验

    根据网上经验来看,结论如下: 单双侧t检验,t值不变,p值除以2即为单侧p值.

  5. python的XML解析

    http://www.jb51.net/article/63780.htm http://www.runoob.com/python/python-xml.html http://kb.cnblogs ...

  6. rabbiit报错处理

    一.ping不同download.yunwei.edu 内网服务地址必须在前面 [root@localhost ~]# vim /etc/resolv.conf # Generated by Netw ...

  7. Appium+python自动化2-环境搭建

    一.必备软件安装 小编的环境是Windows 7版本 64位系统(32位的同学自己想办法哦) 1.jdk1.6.0 (64位) 2.android-sdk_r24.3.4-windows 3.pyth ...

  8. ubuntu中配置jdk1.8

    方法/步骤   1 首先,百度搜索jdk,选择第一个,网站是Oracle Jdk.点击进去 步骤阅读 2 点击Download,到官网下载linux版本的jdk.选择自己对应的操作系统及32或64位版 ...

  9. JavaEE_Test2_Servlet

    package servlet; import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.P ...

  10. jmeter-JDBC 连接池设置