【问题标题】:Display a real time clock (using server time) on aspx page在 aspx 页面上显示实时时钟(使用服务器时间)
【发布时间】:2015-01-07 22:35:01
【问题描述】:

现在我正在使用 updatepanel 和计时器在 aspx 页面上显示一个时钟(小时:分钟 + 日期),它会导致服务器端每 30 秒回发一次。我不喜欢这个解决方案。我想要一个 JavaScript 时钟,它以服务器的基值开始。有人能想出比下面的代码更好的替代方案吗?

    <asp:UpdatePanel ID="UpdatePanelClock" runat="server">
        <ContentTemplate>
             <asp:Label ID="lblTime2" runat="server"></asp:Label>
         </ContentTemplate>
         <Triggers>
                <asp:AsyncPostBackTrigger ControlID="Timer2" EventName="Tick" />
         </Triggers>
   </asp:UpdatePanel>

    <asp:Timer ID="Timer2" runat="server" Interval="30000" OnTick="Timer2_Tick"></asp:Timer>

后面的代码

protected void Page_Load(object sender, EventArgs e)
   {
    if (!Page.IsPostBack)
      {
         lblTime2.Text = DateTimeOffset.Now.ToString("hh:mm tt") + " - " + DateTimeOffset.Now.ToString("dddd, MMMM dd");
      }
   }

【问题讨论】:

    标签: javascript c# asp.net datetime


    【解决方案1】:

    在我自己的库中,我创建了函数getCurrentTime。它是一个多功能的日期和时间获取器和转换器。此函数可以从时间戳创建日期(以微秒为单位)。它允许您创建时钟、日历、倒数计时器等。

    months = "Jan:31;Feb:28;Mar:31;Apr:30;May:31;Jun:30;Jul:31;Aug:31;Sep:30;Oct:31;Nov:30;Dec:31";
    function getCurrentTime(unixTimeStamp)
    {
        if (unixTimeStamp)
        {
            this.dateObject = new Date(unixTimeStamp);
        }
        else
        {
            this.dateObject = new Date();
        }
        // Time
        this.dateObject.h = this.dateObject.getHours();
        this.dateObject.m = this.dateObject.getMinutes();
        if (this.dateObject.m < 10)
        {this.dateObject.m = "0" + this.dateObject.m;}
        this.dateObject.s = this.dateObject.getSeconds();
        if (this.dateObject.s < 10)
        {this.dateObject.s = "0" + this.dateObject.s;}
    
        //Date
        this.dateObject.y = parseInt(this.dateObject.getFullYear());
        this.dateObject.mo = this.dateObject.getMonth()+1;
        if (this.dateObject.mo < 10)
        {this.dateObject.mo = "0" + this.dateObject.mo;}
        this.dateObject.d = this.dateObject.getDate();
        if (this.dateObject.d < 10)
        {this.dateObject.d = "0" + this.dateObject.d;}
        this.today = this.dateObject.d + "/" + this.dateObject.mo + "/" + this.dateObject.y;
        this.now = this.dateObject.d + "/" + this.dateObject.mo + "/" + this.dateObject.y + " " + this.dateObject.h + ":" + this.dateObject.m + ":" + this.dateObject.s;
        this.dateStamp = Date.parse(this.dateObject.mo+"/"+this.dateObject.d+"/"+this.dateObject.y);
    
        //these are the objects returned by getCurrentTime() next to hour, minutes, seconds, year, month and date.
        this.dateObject.fullDate = this.dateObject.d + " " + months.split(/;/)[this.dateObject.mo-1].split(/:/)[0] + " " + this.dateObject.y;
        this.dateObject.timeZoneOffset = dateObject.getTimezoneOffset(); //in minutes.
        this.dateObject.today = this.today;
        this.dateObject.now = this.now;
        this.dateObject.dateStamp = this.dateStamp;
    
        return this.dateObject;
    }
    
        timeStamp = <%= ConvertToTimestamp(DateTime.UtcNow).ToString() %>
        setInterval(clock, 1000);
    
        function clock()
        {   
            timeStamp += 1000;
            var timeObj = getCurrentTime(timeStamp);
            var timeString = timeObj.h + ":" + timeObj.m + ":" + timeObj.s;
            console.log(timeString);
        }
    

    这个没有unixTimeStamp 的函数获取客户端的时间设置,但是如果你用aspx &lt;%= ConvertToTimestamp(DateTime.UtcNow).ToString() %&gt; 加载一个日期变量到它,它将从它得到的时间戳更新。如何检索时间戳:

    public double ConvertToTimestamp(DateTime value)
    {
        //create Timespan by subtracting the value provided from
        //the Unix Epoch
        TimeSpan span = (value - new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime());
    
        //return the total milliseconds (which is a UNIX timestamp * 1000)
        return (long)span.TotalMilliseconds;
    }
    

    http://jsfiddle.net/3Lp4mwpn/:示例

    请注意,getCurrentTime 返回的对象比显示时间的可能性更大。它可以为您提供多种日期格式。

    【讨论】:

    • 显示服务器时间还是客户端时间?我希望它显示服务器时间。
    • 两者。要显示服务器时间,您需要获取服务器时间并将其转换为 milliseconds 中的 timestamp 并将其插入到 getCurrentTime 函数中。
    • @RonaldinhoLearnCoding,因此将timeStamp = 1420671199000; 替换为timestamp = &lt;%= timestamp %&gt;,其中后者是检索到的服务器时间,以毫秒为单位的unix 时间戳。
    • 中的timestamp 是什么?我试过timeStamp = &lt;%= DateTime.UtcNow.ToString("yyyyMMddHHmmssfff") %&gt;;,但没用,什么也没显示
    • @RonaldinhoLearnCoding 我已经用 C# 代码更新了答案以检索正确的时间戳。这应该给你一个基于 javascript 的带有服务器时间的时钟。享受吧。
    猜你喜欢
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 2017-07-27
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2012-10-25
    相关资源
    最近更新 更多