DateTime conversions using NodaTime on ASP.Net MVC 3 Razor website. How to?
我将日期/时间存储在伦敦时区(不是UTC)的数据库中。
我需要的是检索此日期/时间,将其转换为UTC并显示考虑用户的时区(他们在注册到站点时定义的时间区域 - 即:en-GB,en-US等)。
我的第一个问题与MVC结构更相关,因为我对此完全陌生(我是一个WebForms开发人员) - 我应该把这个转换代码/类/帮助器放在哪里? 模型?视图模型?
第二个问题是转换本身 - 我已经玩过NodaTime测试项目,但找不到合适的方法来进行转换。
任何帮助深表感谢。
先感谢您。
Jon Skeet可能需要纠正我,因为我认为这在nodatime中是正确的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // Timezone data provider (inject with DI) IDateTimeZoneProvider timeZoneProvider = DateTimeZoneProviders.Tzdb; // London Timezone (can keep this as a singleton, since it'll be used often) var londonTimeZone = timeZoneProvider["Europe/London"]; // Get your date/time from the database and map it as being local to London timezone var yourDateFromDb = new DateTime(2013, 01, 23, 21, 00, 00); // This is what you'll get back from your database (although you may get back a DateTimeOffset) ZoneLocalMapping zonedDbDateTime = londonTimeZone.AtLeniently(LocalDateTime.FromDateTime(yourDateFromDb)); <-- This is your date time with the correct offset (taking into account DST etc.) // Map the London zoned date/time to the users local date/time var usersTimezoneId ="Europe/Paris"; // <-- Store this value in users profile/db var usersTimezone = timeZoneProvider[usersTimezoneId]; var usersZonedDateTime = zonedDbDateTime.WithZone(usersTimezone); Assert.That(usersZonedDateTime.Hour == 22); |
您可能应该知道,在时区转换(秋季时钟更改)期间,您可能会获得zonedDbDateTime的2个可能日期。 这里的代码只是获得第一个或最早的日期/时间。
编辑:更新了代码段,其中包含Jon Skeet建议的更改
你可以写一些像这样的扩展方法:
1 2 3 4 | public static DateTime ConvertToUtc(this DateTime d) { //do conversin and return it } |
只要您在页面顶部包含ConvertToUtc的命名空间,您就可以从任何视图中调用@ Model.MyDate.ConvertToUtc()。
并进行转换请参阅此页面
使用C#将DateTime从UTC转换为用户提供的时区
http://www.dotnetcurry.com/ShowArticle.aspx?ID=593
如何在ASP.NET中使用时区?