установка даты и времени пользователя как GMT, как преобразовать дату в локализованную настройку? - PullRequest
2 голосов
/ 28 октября 2009

В настройках моих пользователей у меня есть выпадающий список со всеми датами GMT для выбора пользователем.

Как в c # преобразовать дату и время, хранящиеся в базе данных, в их время по Гринвичу?

Время, хранимое в базе данных, является временем сервера.

Ответы [ 3 ]

2 голосов
/ 28 октября 2009

Для .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);
1 голос
/ 28 октября 2009

Я так понимаю, вы сохраняете разницу в GMT для каждого пользователя? То есть 0 или +1 или -6 и т.д?

// Get your DateTime to convert
DateTime databaseDateTime = DateTime.Now;
double userGmtOffset = 1;

// Get the GMT time of the database time
int hoursOffset = TimeZone.CurrentTimeZone.GetUtcOffset(databaseDateTime).Hours;
DateTime gmtDateTime = databaseDateTime.AddHours((double)(0 - hoursOffset));
DateTime userDateTime = gmtDateTime.AddHours(userGmtOffset);
0 голосов
/ 28 октября 2009

Используйте System.DateTimeOffset вместо DateTime. ИТ включает в себя все необходимые вам функции.

...