活动倒计时精准倒计时

 JavaScript  2021-06-23  admin  1213  1637

image.png

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>倒计时</title>
    <link rel="stylesheet" type="text/css" href="/chat/layui/css/layui.css"/>
    <style>
        .kill_time {
            font-size: 80px;
            font-weight: bold;
            text-align: center;
            margin-top: 150px;
        }

        .kill_time span {
            width: 50px;
            padding: 10px;
        }
    </style>
</head>
<body>
<div class="container">
    <div><h2 style="text-align: center;margin-top: 50px;">活动开始时间: {{date('Y-m-d H:i:s',intval($start_time/1000))}}</h2>
    </div>
    <div class="kill_time">
        <span id="kill_hours">00</span>:
        <span id="kill_minutes">00</span>:
        <span id="kill_seconds">00</span>
    </div>
</div>
<script type="text/javascript" src="/chat/js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="/chat/layui/layui.js"></script>
<script src="https://cdn.bootcss.com/socket.io/2.3.0/socket.io.js"></script>
<script>
    const url_websocket = "{{env('URL_WEBSOCKET','ws://192.168.195.129:9603/websocket')}}";
    var start_timestamp = "{{$start_time}}"; // 开始时间 毫秒
    var server_timestamp = 0; //服务器时间戳 毫秒
    var transfer_timestamp = 0; //网络传输时间差 毫秒
    var error_timestamp = 0; //计算时间差 毫秒
    var sync_timestamp = 5000; //同步时间差 毫秒

    /**
     * websocket获取网络时间
     */
    var socket = io(url_websocket, {transports: ["websocket"]});
    socket.on('connect', data => {
        setInterval(function () {
            socket.emit('getServerTimeStamp', '');
        }, sync_timestamp);
    });

    /**
     * 处理本地时间和服务器时间差
     */
    socket.on('setServerTimeStamp', data => {
        var data = JSON.parse(data);
        server_timestamp = data['timestamp'];
        var local_timestamp = new Date().getTime();
        //let t = performance.timing.navigationStart + performance.now();
        transfer_timestamp = performance.timing.responseEnd - performance.timing.responseStart;
        if (!transfer_timestamp) transfer_timestamp = 0;
        error_timestamp = local_timestamp - server_timestamp - transfer_timestamp;
    });

    /**
     * 显示倒计时
     */
    setInterval(function () {
        var local_timestamp = new Date().getTime();
        var time = start_timestamp - local_timestamp + error_timestamp;
        var hours = 0;
        var minutes = 0;
        var seconds = 0;
        if (time > 0) {
            hours = Math.floor(time / (3600 * 1000));
            minutes = Math.floor((time - hours * 3600 * 1000) / (60 * 1000));
            seconds = Math.ceil((time - hours * 3600 * 1000 - minutes * 60 * 1000) / 1000);
        }
        $("#kill_hours").html(hours < 10 ? '0' + hours : hours);
        $("#kill_minutes").html(minutes < 10 ? '0' + minutes : minutes);
        $("#kill_seconds").html(seconds < 10 ? '0' + seconds : seconds);
    }, 500);
</script>
</body>
</html>

php

/**
 * websocket 返回服务器时间
 * @Event("getServerTimeStamp")
 * @param Socket $socket
 * @param string $data
 */
public function onGetServerTimeStamp(Socket $socket, string $data)
{
    $timestamp = microtime(true)*1000;
    $res['server_date'] = date('Y-m-d H:i:s');
    $res['time'] = time();
    $res['timestamp'] = floor($timestamp);
    socketIo()->of('/websocket')->to($socket->getSid())->emit('setServerTimeStamp', Json::encode($res));
}


如果文章对您有帮助,点击下方的广告,支持一下作者吧!

转载必须注明出处:

活动倒计时精准倒计时 —— centhp.com

相关推荐


在go协程中共享资源需要加锁处理

在go协程中共享资源需要加锁处理packagemain import( &quot;fmt&quot; &quot;sync&quot; ) //创建一个互斥锁 varmutex=&amp;sync.Mutex{} //定义一个共享资源 varsharedResource=0 //定义一个等待组 varwg=sync.WaitGroup{} //定义一

go 的 Pool池对象 sync.Pool 创建mysql连接池

//在这个例子中,我们创建了一个sync.Pool,其中包含一个New函数,该函数创建一个MySQL连接 //在someFunction中,我们使用dbPool.Get()从池中获取一个MySQL连接 //然后我们使用连接进行一些操作,最后使用dbPool.Put()将连接放回池中 //我们可以通过设置dbPool的大小来初始化连接池中的连接数量 //例如,如果我们想要初始化10个连接,我

go 的 Pool池对象-sync.Pool

packagemain import( &quot;fmt&quot; &quot;strconv&quot; &quot;sync&quot; ) //在go中,原生的池化数据结构为sync.Pool,有三个方法: //New字段为一个方法,定义为func()interface{},在新建Pool时,定义好New字段,以供后续从池中获取对象时,如果当前池中无对象,则使

go WaitGroup 的使用方法

在 Go 中,sync 包下的 WaitGroup 能有助于我们控制协程之间的同步。当需要等待一组协程都执行完各自任务后,才能继续后续逻辑。这种场景,就非常适合使用它。WaitGroup 提供三个 API。Add(delta int) 函数提供了 WaitGroup 的任务计数,delta 的值可以为正也可以为负,通常在添加任务时使用。Done() 函数其实就是 Add(-1),在任务完成时调用。