公司主营业务是体育赛事为主的;尤其是足球赛事。现正值2016法国欧洲杯;之前忙于做欧洲杯专题没时间总结。现分享一个工作中需求带来的经历。

需求是:从现在开始倒计时欧洲杯还有多久开赛;当开赛之后开始计算已经开赛了几天及计算当前是小组赛还是1/8决赛,1/4决赛,半决赛,决赛。

废话不多说,直接上代码:

 var cdInterval, dateInterval;
//此方法为倒计时欧洲杯开赛时间,原理是用开赛时间的毫秒数减去当前毫秒数然后根据每天,小时,分,秒的毫秒数向下取整
function countDown(){
var agent = navigator.userAgent, startTime;
if(agent.indexOf('Trident') > -1 || agent.indexOf('Edge') > -1) { // ie,因为IE不支持new Date('xxx')创建Date对象的时候传入的时间参数,所以这里使用
                                           //setUTCFullYear和setUTCHours,再getTime()等到当前毫秒数
var euroDate = new Date();
euroDate.setUTCFullYear('2016','05','10');//月份是从0-11的
euroDate.setUTCHours('4','0','0','0');
startTime = euroDate;
} else {
startTime = new Date("2016 06 10 12:00:00");
}
var nowTime = new Date(), distanceTime
,startServer = startTime.getTime(), nowServer = nowTime.getTime();
distanceTime = startServer - nowServer; // 一天的豪秒数86400000 一个小时的毫秒数3600000 一分钟的毫秒数 60000 一秒钟的毫秒数 1000
var d_date, d_hour, d_min,d_second;
if(distanceTime > 0) {
d_date = Math.floor(distanceTime/86400000); //计算还有几天
distanceTime -= d_date*86400000; //减去天数毫秒数计算下面的 小时数,分钟数,秒数
d_hour = Math.floor(distanceTime/3600000);//计算小时
distanceTime -= d_hour*3600000;//减去当前小时的毫秒数
d_min = Math.floor(distanceTime/60000);//计算分
distanceTime -= d_min*60000;//减去当前分的毫秒数
d_second = Math.floor(distanceTime/1000);//计算秒
distanceTime -= d_second*1000;//减去当前秒的毫秒数
if(d_date < 10) {
d_date = '0' + d_date;
}
if(d_hour < 10) {
d_hour = '0' + d_hour;
}
if(d_min < 10) {
d_min = '0' + d_min;
}
if(d_second < 10) {
d_second = '0' + d_second;
}
document.getElementsByClassName('icon-time')[0].innerHTML = d_date; document.getElementsByClassName('icon-time')[1].innerHTML = d_hour; document.getELementsByClassName('icon-time')[2].innerHTML = d_min; document.getElementsByClassName('icon-time')[3].innerHTML = d_second; } else {
clearInterval(cdInterval);
clearInterval(dateInterval);
$('.icon-time:not(:first)').remove(); $('div.time span').each(function(index, item) {
if(index !== 0 && index !== 1) {
$(this).remove();
}
});
backwardDays()
dateInterval = setInterval(backwardDays, 10000);
}
}
//天数,原理为用当前毫秒数减去开赛时候的毫秒数计算出已经开赛了几天
function backwardDays(){
var dataAgent = navigator.userAgent;
var groupGameStart = 0,groupGameEnd = 0,eighthGameStart = 0,eighthGameEnd = 0,fourGameStart = 0,fourGameEnd = 0,halfGameStart = 0,            halfGameEnd = 0,
finalGame = 0,endGame = 0;
var dist_day = '', day = '',now_day = '';
      //计算赛事时间
if(dataAgent.indexOf('Trident') > -1 || dataAgent.indexOf('Edge') > -1) { //同上ie不支持new Date('xx')带参数
var groupDayStart = new Date();
var groupDayEnd = groupDayStart,
eighthDayStart = groupDayStart, eighthDayEnd = groupDayStart,
fourDayStart = groupDayStart,fourDayEnd = groupDayStart,
halfDayStart = groupDayStart,halfDayEnd = groupDayStart,
finalDayStart = groupDayStart,finalDayEnd = groupDayStart;
//小组赛
groupDayStart.setUTCFullYear('2016','05','10'); groupDayStart.setUTCHours('4','0','0','0');
groupGameStart = groupDayStart.getTime();
groupDayEnd.setUTCFullYear('2016','05','24');groupDayEnd.setUTCHours('4','0','0','0');
groupGameEnd = groupDayEnd.getTime();
//1/8决赛
eighthDayStart.setUTCFullYear('2016','05','25'); eighthDayStart.setUTCHours('4','0','0','0');
eighthGameStart = eighthDayStart.getTime();
eighthDayEnd.setUTCFullYear('2016','05','28');eighthDayEnd.setUTCHours('4','0','0','0');
eighthGameEnd = eighthDayEnd.getTime();
//1/4决赛
fourDayStart.setUTCFullYear('2016','06','01'); fourDayStart.setUTCHours('4','0','0','0');
fourGameStart = fourDayStart.getTime();
fourDayEnd.setUTCFullYear('2016','06','04');fourDayEnd.setUTCHours('4','0','0','0');
fourGameEnd = fourDayEnd.getTime();
//半决赛
halfDayStart.setUTCFullYear('2016','06','07'); halfDayStart.setUTCHours('4','0','0','0');
halfGameStart = halfDayStart.getTime();
halfDayEnd.setUTCFullYear('2016','06','08');halfDayEnd.setUTCHours('4','0','0','0');
halfGameEnd = halfDayEnd.getTime();
//决赛
finalDayStart.setUTCFullYear('2016','06','11'); finalDayStart.setUTCHours('4','0','0','0');
finalGame = finalDayStart.getTime();
finalDayEnd.setUTCFullYear('2016','06','11');finalDayEnd.setUTCHours('15','59','0','0');
endGame = finalDayEnd.getTime(); } else {
groupGameStart = new Date("2016 06 10 12:00").getTime();
groupGameEnd = new Date("2016 06 24 12:00").getTime(),//小组赛结束
eighthGameStart = new Date("2016 06 25 12:00").getTime(), // 1/8决赛开始
eighthGameEnd = new Date("2016 06 28 12:00").getTime(), // 1/8决赛结束
fourGameStart = new Date("2016 07 01 12:00").getTime(), // 1/4决赛开始
fourGameEnd = new Date("2016 07 04 12:00").getTime(), // 1/4决赛结束
halfGameStart = new Date("2016 07 07 12:00").getTime(), //半决赛开始
halfGameEnd = new Date("2016 07 08 12:00").getTime(), //半决赛结束
finalGame = new Date("2016 07 11 12:00").getTime(), // 决赛
endGame = new Date("2016 07 11 23:59").getTime(); // 欧洲杯结束
} var currentTime = new Date().getTime();//当前时间
//第几天
now_day = (currentTime - groupGameStart)/86400000;
dist_day = Math.floor((currentTime - groupGameStart)/86400000);
if(now_day > dist_day) {//如果计算出的当前天数大于向下取整的天数,则要加1
day = dist_day + 1;
} else {
day = dist_day
} if(day === 0) {//day等于0的时候表示已经开赛,所以计算为第一天
day = 1;
}
if(day < 10) {
day = '0' + day;
}
$('.icon-time:eq(0)').text(day);
//根据时间范围算出赛事范围
if(currentTime >= groupGameStart && currentTime <= groupGameEnd) {//小组赛
$("em.gameType").text($('#xzs').val());
} else if(currentTime >= eighthGameStart && currentTime <= eighthGameEnd) {// 1/8 决赛
$("em.gameType").text("1/8"+$('#jsi').val());
} else if(currentTime >= fourGameStart && currentTime <= fourGameEnd) {// 1/4决赛
$("em.gameType").text("1/4"+$('#jsi').val());
} else if(currentTime >= halfGameStart && currentTime <= halfGameEnd) {// 半决赛
$("em.gameType").text($('#bjs').val());
} else if(currentTime >= finalGame && currentTime <= endGame) { //决赛
$("em.gameType").text($('#jsi').val());
} else {
$("em.gameType").text("");
} if(currentTime >= endGame) {
clearInterval(dateInterval);
}
}
$(function(){
clearInterval(cdInterval);
cdInterval = setInterval(countDown,1000);
});

使用js倒计时还有几天及计时过了几天的更多相关文章

  1. js倒计时-倒计输入的时间

    计算指定时间到指定时间之间相差多少天.时.分.秒. 节日.活动.商城常用. 原理: 主要使用到时间戳,也就是从1970 年 1 月 1 日 到指定时间的毫秒数. 1. 求出毫秒差 :当两个时间直接进行 ...

  2. js倒计时 手机休眠时 时间不进行减少

    http://www.111cn.net/wy/js-ajax/94218.htm 手机版网页js倒计时存在的问题与解决的方法 www.111cn.net 更新:2015-09-16 编辑:kp123 ...

  3. JS倒计时(刷新页面不影响)的实现思路

    最近在做一个项目,用到了点击按钮实现倒计时,这个用js来实现很简单.但是遇到了一个问题 页面刷新后js重新加载导致 倒计时重新开始,或者直接初始化了 后来通过 cookie 保存来实现了js倒计时,关 ...

  4. js 倒计时(可自定义时间)

    <html> <head> <title>js 倒计时</title> </head> <body> <div> & ...

  5. js倒计时显示

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>j ...

  6. Js倒计时程序

    Js倒计时程序 点击下载

  7. JS倒计时网页自动跳转代码

    <title>JS倒计时网页自动跳转代码</title> <script language="JavaScript" type="text/ ...

  8. JS倒计时 代码

    JS倒计时 代码 <div> <span id="KSD">3</span>天 <span id="KSH">1 ...

  9. js倒计时函数和(js禁用和恢复a标签的操作)

    <script type="text/javascript"> /*获取手机号*/ var start_time=60; function get_phone_nums ...

随机推荐

  1. MySQL 5.6 记录 SQL 语句与慢查询

    环境: MySQL 如果需要记录 MySQL 的查询语句,需要在配置文件(Linux 下为 my.cnf,Windows 下为 my.ini)中添加配置: general_log = ON gener ...

  2. Yii源码阅读笔记(三十五)

    Container,用于动态地创建.注入依赖单元,映射依赖关系等功能,减少了许多代码量,降低代码耦合程度,提高项目的可维护性. namespace yii\di; use ReflectionClas ...

  3. 安装运行Hadoop

    1 准备环境 1.1 Ubuntu 或者 VMware Workstation Pro+Ubuntu 1.2 Jdk 1.3 eclipse 或其他开发工具(可选) 2 安装Hadoop 2.1 从h ...

  4. 阿里云服务器Linux CentOS安装配置(七)域名解析

    阿里云服务器Linux CentOS安装配置(七)域名解析 1.购买域名 登录阿里云,左侧菜单点击[域名],然后[域名注册],完成域名购买.(一般首年45元) 2.添加域名解析 在域名列表里点击你的域 ...

  5. Thinking in Java——笔记(11)

    Holding Your Objects In general, your programs will always be creating new objects based on some cri ...

  6. 3D滚动下拉菜单-简直不要太任性

    预览 先看看最终效果 简介 由来 最初看到这个是在14年5月,猛戳这里:妙味官网,觉得非常炫.想要做出来,所以就开始学习web. 那时候是做c/s的,也因为这个走上了b/s之路,(゚Д゚≡゚Д゚) 现 ...

  7. backbonejs

    前言: backbone由以下模块组成. 一.Event 监听事件,自定义事件.绑定到任何对象. http://www.css88.com/doc/backbone/#Events 这个是下面模块核心 ...

  8. SQL语句 - MERGE INTO 、Cross/Outer Apply用法理解

    MERGE INTO 语法: MERGE INTO table_name alias1 USING (table|view|sub_query) alias2ON (join condition) W ...

  9. UIKit的外观属性及方法汇总

    本文授权转载,作者:楚天舒(简书) 开发中经常会碰到要设置UI的某个生僻的外观属性,虽然在头文件中都能查到,但一是每个控件的头文件比较分散繁杂,二是每个头文件里有太多不用到的方法和属性,所以这里将UI ...

  10. UWP&WP8.1 重新绘制图片 WriteableBitmap用法 图片转byte[]数组,byte[]数组转图片

    ---恢复内容开始--- WriteableBitmap 是UWP和WP8.1绘制图片的,重组图片的最重要方法.方法较为简单,方法多样性. 通过查看文档,WriteableBitmap的继承性是    ...