Я бы рекомендовал использовать DateTime
в сочетании с TimeZoneInfo .Вы можете хранить время UTC на своем сервере и конвертировать время для каждого пользователя, используя его TimeZoneInfo
.TimeZoneInfo
может быть установлен пользователем, или вы можете каким-то образом извлечь его из настроек Windows
, если это возможно.Мы просим пользователей установить их TimeZoneInfo
(через раскрывающийся список) на странице их настроек.
Обновление
В то время как Microsoft заявляет в MSDN, что мы должны использоватьDateTimeOffset
вместо DateTime
есть некоторые проблемы при использовании DateTimeOffset
.Я не смог сериализовать / десериализовать экземпляры DataTimeOffset, передавая их через WCF.И DateTime / TimeZoneInfo работает отлично.Мне очень нравится DateTimeOffset, но он до сих пор не подходит для реальных приложений.
И еще один недостаток DateTimeOffset в том, что он не содержит всю информацию, необходимую для преобразования времени, потому что онсодержит только смещение.Но может быть несколько фактических часовых поясов с одним и тем же смещением, поэтому вы не можете восстановить часовой пояс только по смещению.И часовой пояс - это не просто смещение, это набор правил, определяющих преобразование времени, зимнего / летнего времени и т. Д.
Обновление
Вот вы:
private static DateTime ToUTC(int day, int month, int year, int hour, decimal utcOffset)
{
TimeSpan offset = TimeSpan.FromMinutes((double)(utcOffset * 60)); // time zone offset is always aligned to minutes
return new DateTimeOffset(year, month, day, hour, 0, 0, offset).ToUniversalTime().DateTime;
}