我将日期/时间存储在伦敦时区(不是 UTC)的数据库中。我需要的是检索此日期/时间,将其转换为 UTC 并考虑用户的时区(他们在注册到站点时定义 - 即:en-GB、en-US 等)显示。
我的第一个问题与 MVC 结构更相关,因为我对此完全陌生(我是一名 WebForms 开发人员)——我应该把这个转换代码/类/帮助器放在哪里?模型?视图模型?
第二个问题是转换本身——我玩过 NodaTime 测试项目,但找不到进行这种转换的正确方法。
任何帮助深表感谢。
先感谢您。
我将日期/时间存储在伦敦时区(不是 UTC)的数据库中。我需要的是检索此日期/时间,将其转换为 UTC 并考虑用户的时区(他们在注册到站点时定义 - 即:en-GB、en-US 等)显示。
我的第一个问题与 MVC 结构更相关,因为我对此完全陌生(我是一名 WebForms 开发人员)——我应该把这个转换代码/类/帮助器放在哪里?模型?视图模型?
第二个问题是转换本身——我玩过 NodaTime 测试项目,但找不到进行这种转换的正确方法。
任何帮助深表感谢。
先感谢您。
Jon Skeet 可能需要纠正我,因为我假设这在nodatime中是正确的:
// 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 建议的更改
你可以写一些这样的扩展方法:
public static DateTime ConvertToUtc(this DateTime d)
{
//do conversin and return it
}
只要您在页面顶部包含 ConvertToUtc 的命名空间,您就可以像 @Model.MyDate.ConvertToUtc() 一样从您希望的任何视图中调用它。并进行转换,请参阅此页面
使用 C# 将 DateTime 从 UTC 转换为用户提供的时区