0

从昨天开始,我一直在寻找答案,但无济于事。我尝试过模型活页夹、布局模板(不适用于我的案例)等。

让我澄清一下我真正需要什么。

我在 SQL Server 2008 R2 数据库中的许多表上有许多 DateTime 字段。它们存储在伦敦时区。我已经设法(在你们的帮助下)将 DateTime 转换为用户的时区并正确显示它们。我现在需要的是一种自动化的方法。每次站点显示来自数据库的 DateTime 时,都需要预先进行转换。输入将保持原样。

如果它是关于 WebForms 开发的——我已经习惯了——我只会创建一个处理程序。但我不知道 MVC 3 Razor 的最佳实践是什么。

有人可以在这里给我一些指示吗?

提前致谢。

互补

这是转换 DateTime 的代码:

// Timezone data provider
IDateTimeZoneProvider timeZoneProvider = DateTimeZoneProviders.Tzdb;

// Database Timezone = London
var londonTimeZone = timeZoneProvider["Europe/London"];

//// Getting date/time from the database and mapping it as being local to London timezone
//var yourDateFromDb = new DateTime(source.Year, source.Month, source.Day, source.Hour, source.Minute, source.Second, source.Millisecond);
//ZoneLocalMapping map = londonTimeZone.MapLocal(LocalDateTime.FromDateTime(yourDateFromDb));
//// This is the date/time with the correct offset (taking into account DST etc)
//var zonedDbDateTime = map.First();

// Jon Skeet suggestion instead of using the Mapping
// http://stackoverflow.com/questions/16164994/datetime-conversions-using-nodatime-on-asp-net-mvc-3-razor-website-how-to/16178730?noredirect=1#16178730
//
var dateTimeFromDb = new DateTime(source.Year, source.Month, source.Day, source.Hour, source.Minute, source.Second, source.Millisecond);
var zonedDbDateTime = londonTimeZone.AtLeniently(LocalDateTime.FromDateTime(dateTimeFromDb));

// Map the London zoned date/time to the users local date/time (saved on the Session)
var usersTimezoneId = (HttpContext.Current.Session["timezoneid"] != null ? HttpContext.Current.Session["timezoneid"].ToString() : "UTC");
var usersTimezone = timeZoneProvider[usersTimezoneId];
var usersZonedDateTime = zonedDbDateTime.WithZone(usersTimezone);

return usersZonedDateTime.ToDateTimeUnspecified();
4

1 回答 1

0

我找到了适用于 DateTime 扩展的解决方案:

public static DateTime ToLocalTimeZone(this DateTime dateTime) { 
    IDateTimeZoneProvider timeZoneProvider = DateTimeZoneProviders.Tzdb; 
    var londonTimeZone = timeZoneProvider["Europe/London"];

    var dateTimeFromDb = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day,
       dateTime.Hour, dateTime.Minute, dateTime.Second, dateTime.Millisecond); 
    var zonedDbDateTime = londonTimeZone.AtLeniently(LocalDateTime.FromDateTime(dateTimeFromDb));

    var usersTimezoneId = (HttpContext.Current.Session["timezoneid"] != null ? HttpContext.Current.Session["timezoneid"].ToString() : "UTC"); var usersTimezone = timeZoneProvider[usersTimezoneId]; var usersZonedDateTime = zonedDbDateTime.WithZone(usersTimezone);

    return usersZonedDateTime.ToDateTimeUnspecified(); 
}

不确定最佳实践,因为正如我所指出的,我对 MVC 模型完全陌生。但它正在发挥作用。

于 2013-04-25T08:05:48.400 回答