我有一个ASP.NET应用程序和服务器上的UTC时间戳。我想将时间戳以正确的时区和本地日期/时间格式显示给用户。
服务器上的情况恰恰相反。我们可以利用Accept-Language HTTP标头来获取用户的语言环境({{link1:可能不是最佳选择,但可能足够好}}),然后利用.NET已知语言环境的数据库,所以我们的代码类似于
但是我们卡在了时区问题上。是的,可以通过JavaScript获取它,然后作为cookie或postback数据传回,但如果我们需要在应用程序的第一个页面上显示日期怎么办?有人可能会认为第一页总是登录页面,但当用户登录信息在会话之间持久化(“记住我”选项)时,情况并非如此。解决这个问题的方法可能是将时区偏移保存为用户配置文件的一部分,但它可能很容易变得陈旧(在会话之间进出夏令时)。是否有一个全面的解决方案来解决这个问题,既能表现良好,又不需要编写大量代码?我非常好奇,请给予建议。
例如,对于位于美国纽约(UTC-0500)的用户,Jan 2, 2012 14:00:00 UTC
应显示为1/2/2012 9:00 AM
,对于位于英国伦敦的用户,则应显示为02/01/2012 14:00
。
这看似简单的任务却证明非常困难。MSDN有一篇文章标题相同,但是它讨论的是解析用户输入而不是显示服务器端数据,因此并不完全适用。
可以通过JavaScript轻松确定客户端的时区偏移量
offset = new Date().getTimezoneOffset();
toLocaleString()
方法,其结果是一个丑陋的长字符串,例如Monday, January 02, 2012 9:00:00 AM
。没有提供更短的格式,因此在客户端上,我们被困在良好的时区信息和不良日期/时间格式功能中。服务器上的情况恰恰相反。我们可以利用Accept-Language HTTP标头来获取用户的语言环境({{link1:可能不是最佳选择,但可能足够好}}),然后利用.NET已知语言环境的数据库,所以我们的代码类似于
CultureInfo userCulture = new CultureInfo(Request.UserLanguages [0]);
加上一些错误处理。但是我们卡在了时区问题上。是的,可以通过JavaScript获取它,然后作为cookie或postback数据传回,但如果我们需要在应用程序的第一个页面上显示日期怎么办?有人可能会认为第一页总是登录页面,但当用户登录信息在会话之间持久化(“记住我”选项)时,情况并非如此。解决这个问题的方法可能是将时区偏移保存为用户配置文件的一部分,但它可能很容易变得陈旧(在会话之间进出夏令时)。是否有一个全面的解决方案来解决这个问题,既能表现良好,又不需要编写大量代码?我非常好奇,请给予建议。
'01/02/2012 2:00 PM'
、'2012-01-02 14.00'
或者可能是'02.01.2012 14:00'
? - Ivan Krivyakov(new Image).src=encoded_string
! 这样他们可以在主页面完成渲染之前将数据传递给服务器,而不需要使用cookies或postback。 - Ivan Krivyakov