Для .NET 3.5+ вы можете сохранить идентификатор часового пояса системы у пользователя (вы можете получить его из TimeZoneInfo.GetSystemTimeZones
) и использовать TimeZoneInfo
для преобразования между часовыми поясами:
// In a User class that has a string timeZoneId field (for example)
public DateTime GetLocalDateTime(DateTime originalDate) {
DateTime utcDate = TimeZoneInfo.Local.ConvertToUtc(originalDate);
TimeZone userTimeZone = TimeZoneInfo.FindSystemTimeZoneById(this.timeZoneId);
return TimeZone.ConvertTime(utcDate, userTimeZone);
}
В .NET 2.0 вы ограничены более старым классом TimeZone
, который доступен только для локальной системы. Вы автоматически не получаете информацию о переходе на летнее время для пользователя, поэтому вам придется хранить ее вместе с базовым смещением GMT / UTC.
// In a User class that has a double utcOffset field (for example)
public DateTime GetLocalDateTime(DateTime originalDate) {
DateTime utcDate = TimeZone.CurrentTimeZone.ToUniversalTime(originalDate);
return utcDate.AddHours(this.utcOffset);
}
// Usage
DateTime localDate = user.GetLocalDateTime(DateTime.Now);