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

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

例如Jan 2, 2012 14:00:00 UTC应显示给用户在纽约,美国(UTC -0500)和Jan 2, 2012 14:00:00 UTC 02/01/2012 14:00至用户1/2/2012 9:00 AM在英国伦敦。

这看似简单的任务证明是非常困难的。 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(),但是不同浏览器的结果差别很大,大多数似乎都忽略了本地设置。

链接地址: http://www.djcxy.com/p/57121.html

上一篇: How to display localized date and time information to web users with ASP.NET

下一篇: play pcm data by webAudio API