我有一张表需要在客户的时区显示日期/时间。但是,我很难找到有效地做到这一点的方法。我知道我可以使用客户端javascript获取时区(并且这个方法有点不稳定),但我需要在Page_Load事件中,所以我不能事先调用javascript。
我可以从单独的页面(例如登录时)获取它,但这并不总是有效,因为有时候人们会直接在内部页面中使用书签,并绕过使用cookie的登录。
所以我有几个选择: 1.为每个用户提供最后一个时区的缓存,我会在每个机会填写一个回发,但不保证它是正确的)
尝试一些奇怪的IP地理定位黑客
拥有一个允许用户设置时区的用户个人资料(再次,如果他们旅行,他们也不会总是正确的)
尝试一些funkly页面重定向强制回发,(但有些浏览器禁用页面重定向)
让用户明确设置TZ
在Javascript中进行tz格式化
这些都不是理想的,在我看来,浏览器应该提供服务器的信息。有没有人有任何其他建议?
答案 0 :(得分:5)
如果可能,显示时间相对。而不是显示特定的时间,使用散文,如“5分钟前”或“上周。”
如果您必须在客户的时区显示绝对时间,根据您的评论我会选择#5,将UTC时间发送到浏览器,然后使用JavaScript显示本地时间。根据您的描述,用户可以访问需要在未登录时显示时区的页面,因此将其存储在用户配置文件中似乎不够。
我在Advice for Storing and Displaying Dates and Times Across Different Time Zones中更详细地讨论了相对时间显示概念,并在DateTime
结构上提供了一个简单的扩展方法,用于添加ToRelativeDateString
方法,以便您可以编写代码如:
string relativeTime = myDateTimeVariable.ToRelativeDateString();
希望这会有所帮助......
答案 1 :(得分:0)
我会使用混合策略:
答案 2 :(得分:0)
将时区保留在用户配置文件中,但是在您显示它(或在母版页中)的每个页面上,用户都可以调整它。一旦调整后允许它在会话的剩余时间内持续存在,如果他们想要设置,那么他们需要在他们的个人资料中设置它。
答案 3 :(得分:0)
5,2,3,4,1可能是您选择的最佳顺序。
答案 4 :(得分:0)
只需以UTC格式输出所有时间,然后在客户端转换为本地时间。
答案 5 :(得分:0)
我不得不同意斯科特迈克尔。显示相对时间,如果您需要绝对时间,浏览器已经知道如何从UTC本地化它们。
但是,如果您正在寻找使用javascript强力检测时区(使用服务器端);看看jsTimezoneDetect。它将为您提供一个Olsen时区密钥,您可以将其用于日期时间的服务器端规范化。
答案 6 :(得分:-1)
我以为我会给你一个更新。我确实采取了在客户端格式化日期的各种建议(或者更具体地说,重新格式化它。)作为谷歌饲料,我在本文末尾对此进行了完整的解释。
然而,问题是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");
这会将这些标签单元重新格式化为基于区域设置的格式。