【问题标题】:Client Timezone in ASP.NETASP.NET 中的客户端时区
【发布时间】:2010-11-27 21:32:12
【问题描述】:

我有一张表格,需要在客户的时区显示日期/时间。但是,我很难找到一种有效地做到这一点的方法。我知道我可以使用客户端 javascript 来获取时区(而且这种方法有点不稳定),但我在 Page_Load 事件中需要它,所以我不能事先调用 javascript。

我可以从单独的页面获取它(例如在登录时),但这并不总是有效,因为有时人们会直接在内部页面中使用书签,并通过 cookie 绕过登录。

所以我有几个选择: 1. 每个用户都有一个缓存,用于最后一个时区,我会在回发的每个机会中填充它,但不能保证它是正确的)

  1. 尝试一些奇怪的 IP 地理定位技巧

  2. 拥有一个允许用户设置时区的用户个人资料(同样,如果他们旅行,这也不总是正确的)

  3. 尝试一些时髦的页面重定向来强制回发,(但一些浏览器禁用页面重定向)

  4. 让用户明确设置 TZ

  5. 在 Javascript 中进行 tz 格式化

这些都不是理想的,在我看来是浏览器应该提供服务器的信息。有人有其他建议吗?

【问题讨论】:

  • 只是好奇,你在这个上采用了哪种解决方案?

标签: javascript asp.net timezone


【解决方案1】:

如果可能,相对显示时间。不要显示特定时间,而是使用散文,例如“5 分钟前”或“上周”。

如果您必须在客户端的时区显示绝对时间,根据您的 cmets,我会选择选项 #5,将 UTC 时间发送到浏览器,然后使用 JavaScript 显示本地时间。根据您的描述,听起来用户无需登录即可访问需要在其时区显示时间的页面,因此将其存储在用户配置文件中似乎不够。

我在Advice for Storing and Displaying Dates and Times Across Different Time Zones 中更详细地讨论了相对时间显示的概念,并在DateTime 结构上提供了一个简单的扩展方法,用于添加ToRelativeDateString 方法,以便您可以编写如下代码:

string relativeTime = myDateTimeVariable.ToRelativeDateString();

希望这会有所帮助...

【讨论】:

    【解决方案2】:

    我会使用混合策略:

    1. 用户可以在个人资料中设置时区
    2. 默认是“auto”,意思是:用 JavaScript 格式化

    【讨论】:

      【解决方案3】:

      将时区保留在用户个人资料中,但是在您显示它的每个页面(或母版页)上,用户都可以对其进行调整。一旦调整后允许它在会话的剩余时间内持续存在,如果他们想要设置它,那么他们需要在他们的配置文件中设置它。

      【讨论】:

        【解决方案4】:

        5、2、3、4、1 可能是您选择的最佳顺序。

        【讨论】:

          【解决方案5】:

          只需以 UTC 格式输出所有时间,然后在客户端转换为本地时间。

          【讨论】:

            【解决方案6】:

            我必须同意 Scott Michael 的观点。显示相对时间,如果您需要绝对时间,您的浏览器已经知道如何从 UTC 本地化它们。

            但是,如果您正在寻找使用 javascript(用于服务器端)稳健地检测时区;查看jsTimezoneDetect。它将为您提供一个 Olsen 时区密钥,您可以将其用于日期时间的服务器端规范化。

            【讨论】:

              【解决方案7】:

              我想我会给你一个更新。我确实接受了在客户端格式化日期的各种建议(或者更具体地说是重新格式化它。)作为谷歌素材,我在这篇文章的末尾对此做了完整的解释。

              但是,问题在于 Date.toLocaleString 没有参数来控制格式,因此,无论如何,在我的美国语言环境中,我得到了一个大字符串“Saturday, November 27, 2010 3:58:38 PM” 这个太笨重了,我想要一个紧凑的格式,比如 Sat 11/27/10 3:58PM" 但没有办法控制它 AFAIK。

              因此,我将进行修改以尝试根据来自各个关键页面的输入回发时区偏移量来缓存会话中的时区,并包括在用户配置文件中修改 tz 的功能。这不是很好,但这是我能想到的最好的。就像我说的,这确实应该包含在浏览器的 http 标头中。

              ----- 客户端格式化------------

              所以我有这样的标签(在 ListView FWIW 中):

              <asp:Label ID="TimeLabel" runat="server" class="UTCTimeCell Hidden">
                  <%# Eval("when") %> UTC
              </asp:Label>
              

              请注意,您必须在时区中包含 UTC,因为默认的 ASP.NET 格式化程序不包含它。 (这里我假设您将日期存储为 UTC,在几乎所有情况下您都应该这样做。)注意 Hidden 是我与 display:none 一起使用的标准 css 类。

              然后我在我的 utilties javascript 中定义了以下函数(显然我使用的是 jQuery...)

              function timeFormatLocal(timeStr) {
                  var dt = new Date(timeStr);
                  return dt.toLocaleString();
              }
              
              function timeReformatLocal(selector) {
                  $(selector).each(function () {
                      $(this).html(timeFormatLocal($(this).html()));
                  });
              }
              

              然后在我的页面就绪事件中,我使用如下内容:

              timeReformatLocal(".UTCTimeCell");
              $(".UTCTimeCell").removeClass("Hidden");
              

              这会将这些标签单元格重新格式化为基于语言环境的格式。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-07-12
                • 2010-12-13
                • 2012-10-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-10-01
                • 1970-01-01
                相关资源
                最近更新 更多