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

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. C# 防火墙操作之开启与关闭

    通过代码操作防火墙的方式有两种:一是代码操作修改注册表启用或关闭防火墙:二是直接操作防火墙对象来启用或关闭防火墙.不论哪一种方式,都需要使用管理员权限,所以操作前需要判断程序是否具有管理员权限. 1. ...

  2. 菜鸟的周末_Python试水

    搭建开发环境 下载安装包,打开官网,选择最新Windows Installer版本下载. 运行安装包,勾选Add Python 3.8 to Path,选择Install Now,等待安装完成,直接关 ...

  3. spring整合mybatis(代理的方式)【我】

    创建项目等同上一篇非代理方式随笔,只说不一样的部分: 项目结构主要是多了下面红框部分: 配置文件: 主要是dao配置文件中多了Mapper代理java类的扫描包路径: applicationConte ...

  4. Selenium 2自动化测试实战27(unittest重要概念,test fixture、test case、test suite和test runne)

    一.unittest重要概念 4个重要概念:test fixture.test case.test suite和test runner. 1.Test Case一个TestCase的实例就是一个测试用 ...

  5. The inherit, initial, and unset values

    The  inherit, initial, and unset keywords are special values you can give to any CSS property. Tests ...

  6. 007. Reverse Integer

    题目链接:https://leetcode.com/problems/reverse-integer/description/ Given a 32-bit signed integer, rever ...

  7. C语言:二维数组,(杨辉三角)

    二维数组:一维数组中的元素又是一个数组.声明的语法:数据类型 数组名[一维长度][二维长度]; int num[3][2]; 注意:int[][2];正确 int[2][];错误 二维数组中: 一维可 ...

  8. python多进程——进程间通信

    (一)进程锁 抢票的例子: # -*- coding:utf-8 -*- from multiprocessing import Process, Lock import time import js ...

  9. SQL常见面试题(借书卡表_图书表_借书记录表)

    问题描述: 本题用到下面三个关系表: CARD 借书卡:          CNO 卡号,NAME 姓名,CLASS 班级 BOOKS 图书:           BNO 书号,BNAME 书名,AU ...

  10. php配置php-fpm启动参数及配置详

    php-fpm 启动参数及重要配置详解 约定几个目录 /usr/local/php/sbin/php-fpm/usr/local/php/etc/php-fpm.conf/usr/local/php/ ...