Javascript ASP.NET中的客户端时区

Javascript ASP.NET中的客户端时区,javascript,asp.net,timezone,Javascript,Asp.net,Timezone,我有一个表,需要显示客户时区中的日期/时间。然而,我很难找到一种有效的方法。我知道我可以使用客户端javascript获取时区(这个方法有点古怪),但是我需要在Page_Load事件中使用它,所以我不能事先调用javascript 我可以从一个单独的页面(比如在登录时)获得它,但这并不总是有效的,因为有时人们直接使用书签进入内部页面,并使用cookie绕过登录 因此,我有几个选择: 1.为每个用户提供上一个时区的缓存,我在每次回发时都会将其填满,但不保证它是正确的) 尝试一些奇怪的IP地理定位黑

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

我可以从一个单独的页面(比如在登录时)获得它,但这并不总是有效的,因为有时人们直接使用书签进入内部页面,并使用cookie绕过登录

因此,我有几个选择: 1.为每个用户提供上一个时区的缓存,我在每次回发时都会将其填满,但不保证它是正确的)

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

  • 有一个允许用户设置时区的用户配置文件(同样,如果他们旅行,这也不总是正确的)

  • 尝试一些有趣的页面重定向以强制回发(但某些浏览器禁用页面重定向)

  • 让用户明确设置TZ

  • 在Javascript中执行tz格式设置


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

    我会使用混合策略:

  • 用户可以在其配置文件中设置时区
  • 默认值为“auto”,意思是:使用JavaScript格式化

  • 在用户配置文件中保留时区,但在显示时区的每一页(或母版页)上,用户都可以调整时区。一旦它被调整,允许它在会话的剩余时间内保持,如果他们想要设置它,那么他们需要在他们的配置文件中设置它。

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

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

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

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

    我在中更详细地讨论了相对时间显示的概念,并在
    DateTime
    结构上提供了一个简单的扩展方法,用于添加
    ToRelativeDateString
    方法,以便编写如下代码:

    string relativeTime = myDateTimeVariable.ToRelativeDateString();
    

    希望这有帮助…

    我想我会给你一个更新。我确实采纳了在客户端设置日期格式的各种建议(或者更具体地说,重新设置日期格式)。作为google fodder,我在这篇文章的末尾对此做了充分的解释

    然而,问题是Date.toLocaleString不需要任何参数来控制格式,因此,在我的美国语言环境中,我得到了一个很大的字符串“Saturday,11月27日3:58:38 PM”这太大了,我想要一个像Sat 11/27/10 3:58 PM这样的紧凑格式,但根本无法控制它

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

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

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

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

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

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

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


    但是,如果您正在寻找使用javascript(用于服务器端)可靠地检测时区的方法,请查看。它将为您提供一个奥尔森时区键,您可以使用该键进行服务器端日期时间的规范化。

    只是好奇,您在这方面使用了哪种解决方案?
    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");