如何用ASP.NET向web用户显示本地化的日期和时间信息



我有一个ASP。. NET应用程序和服务器上的UTC时间戳。我想在正确的时区向用户显示时间戳,并使用本地日期/时间格式

Jan 2, 2012 14:00:00 UTC对美国纽约(UTC -0500)的用户显示为1/2/2012 9:00 AM,对英国伦敦的用户显示为02/01/2012 14:00

这个看似简单的任务被证明是非常困难的。MSDN有一篇相同标题的文章,但它讨论的是解析用户输入,而不是显示服务器端数据,所以它不完全适用。

时区偏移很容易在客户端通过JavaScript确定

offset = new Date().getTimezoneOffset();

但是JavaScript对日期/时间格式的支持很差。所有您得到的是toLocaleString()方法,这将导致难看的长字符串,如Monday, January 02, 2012 9:00:00 AM。没有提供更短的格式,所以在客户端我们被困在良好的时区信息和糟糕的日期/时间格式功能。

服务器上的情况正好相反。我们可以利用Accept-Language HTTP报头获取用户语言环境(不是最好的选择,但可能已经足够好了),然后进入已知语言环境的.NET数据库,因此我们的代码沿着

一行进行

CultureInfo userCulture = new CultureInfo(Request.UserLanguages[0]);加上一些错误处理。

但是我们被时区问题困住了。是的,可以通过JavaScript获得它,然后作为cookie或回发数据传回,但如果我们需要在应用程序的第一页显示日期呢?有人可能会争辩说,第一页总是登录页,但当用户登录信息在会话之间持久化时("记住我"选项),情况就不是这样了。解决方案可以是将时区偏移量保存为用户配置文件的一部分,但这样很容易变得过时(在会话之间打开和关闭夏令时)。

是否有一个全面的解决方案来解决这个问题,执行良好,不需要编写大量的代码?我很好奇,请指教。

您应该以标准形式将时间字符串传递给客户端,例如ISO8601:

var timeString = '2012-01-02T16:00:00Z';

有些浏览器可以正确解析ISO8601字符串,有些则不能,所以请手动解析以确保。这很简单——创建一个本地日期对象,然后设置UTC日期和时间:

function localDateFromUTC(s) {
  var x = s.split(/[-s:tz]/i);
  var d = new Date();
  d.setUTCFullYear(x[0], x[1], x[2]);
  d.setUTCHours(x[3], x[4], x[5]);
  return d;
}
var s = '2012-01-02T16:00:00Z';
var d = localDateFromUTC(s);
alert(d); // Shows local date and time for the provided UTC date and time

如果你想要一个特定的输出,你需要手动格式化它,例如

function formatDate(d) {
  var days = ['Sunday','Monday','Tuesday','Wednesday',
              'Thursday','Friday','Saturday'];
  var months = ['January','February','March','April','May','June','July',
                'August','September','October','November','December'];
  return days[d.getDay()] + ', ' + d.getDate() + ' ' + 
              months[d.getMonth()] + ', ' + d.getFullYear();
} 

您可以尝试使用toLocaleString(),但结果在浏览器之间差异很大,大多数似乎忽略了本地设置。

最新更新