繁体   English   中英

ASP.NET中的客户端时区

[英]Client Timezone in ASP.NET

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

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

所以我留下了一些选择:1。为每个用户提供一个缓存,我在每个机会都填写一个回发,但不保证它是正确的)

  1. 尝试一些奇怪的IP地理定位黑客

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

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

  4. 让用户明确设置TZ

  5. 在Javascript中执行tz格式化

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

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

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

我在不同时区的存储和显示日期和时间的建议中更详细地讨论了相对时间显示概念, DateTime结构上提供了一个简单的扩展方法,用于添加ToRelativeDateString方法,以便您可以编写如下代码:

string relativeTime = myDateTimeVariable.ToRelativeDateString();

希望这可以帮助...

我会使用混合策略:

  1. 用户可以在其配置文件中设置时区
  2. 默认为“auto”,表示:使用JavaScript格式化

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

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

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

我不得不同意斯科特迈克尔。 显示相对时间,如果您需要绝对时间,浏览器已经知道如何从UTC本地化它们。

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

我以为我会给你一个更新。 我确实采取了在客户端格式化日期的各种建议(或者更具体地说,重新格式化它。)作为Google饲料,我在本文末尾对此进行了完整的解释。

但是,问题是Date.toLocaleString没有参数来控制格式,因此,在我的美国语言环境中,无论如何,我得到一个很大的字符串“星期六,2010年11月27日下午3:58:38”这也是笨重,我想要一个紧凑的格式,如星期六11/27/10 3:58 PM“但是没有办法控制它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类。

然后我在我的utilities 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");

这会将这些标签单元格重新格式化为基于区域设置的格式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM