Как конвертировать DateTime в конкретный часовой пояс?
Мне трудно понять, как работает UTC.
Мне нужно сделать следующее, но я все еще запутался, если бы получил правильный результат.
Цели:
- Убедитесь, что все сохраненные даты в базе данных находятся в формате UTC.
- Обновление DefaultTimezone находится в Маниле
- Убедитесь, что все возвращенные даты указаны в Manila Time.
Итак, код:
public ConvertDate(DateTime? dateTime)
{
if (dateTime != null)
{
Value = (DateTime)dateTime;
TimeZone = GetFromConfig.DefaultTimeZone();
}
}
public ConvertDate(DateTime? dateTime, int GMTTimeZone)
{
if (dateTime != null)
{
Value = (DateTime)dateTime;
TimeZone = GMTTimeZone;
}
}
public int TimeZone
{
get { return m_TimeZone; }
set { m_TimeZone = value; }
}
DateTime m_Value;
public DateTime Value
{
get { return m_Value; }
set
{
m_Value = value;
DateTime converted = m_Value.ToUniversalTime().ToLocalTime();
}
}
Использование образца:
DateTime SampleInputFromUser = new DateTime(2012, 1, 22);
ConvertDate newConversion = new ConvertDate(SampleInputFromUser, 21);
DateTime answer = newConversion.Value;
Теперь я запутался в "TimeZone". Я не знаю, как использовать его для достижения целей.
Надеюсь, вы поймете мой вопрос и постараетесь добиться поставленных целей.
Изменить
В соответствии с ответом @raveturned, я получаю следующий код:
*** Добавлен в метод ConvertDate
TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById(GetFromConfig.ManilaTimeZoneKey());
ManilaTime = TimeZoneInfo.ConvertTime(dateTime.Value, TimeZoneInfo.Local, timeInfo).ToUniversalTime();
** Новое свойство
DateTime _ManilaTime;
public DateTime ManilaTime
{
get { return _ManilaTime; }
set { _ManilaTime = value; }
}
Ответы
Ответ 1
У платформы .NET уже есть классы и методы, доступные для преобразования DateTimes между разными часовыми поясами. Посмотрите на методы ConvertTime класса TimeZoneInfo.
Изменить:. Когда вы получаете время для ввода в базу данных, предполагая, что оно было создано с правильной информацией о часовом поясе, вы можете легко конвертировать в UTC:
DateTime utcTime = inputDateTime.ToUniversalTime();
Получите timeInfo, как это сделано в вопросе редактирования:
TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById(GetFromConfig.ManilaTimeZoneKey());
Когда вы отправляете пользователю время базы данных, преобразуйте его в правильный часовой пояс, используя timeInfo
.
DateTime userTime = TimeZoneInfo.ConvertTimeFromUtc(dbDateTime, timeInfo);
Лично я бы попытался сохранить эту логику отдельно от методов get/set.
Ответ 2
TimeZoneInfo infotime = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time (Mexico)");
DateTime thisDate = TimeZoneInfo.ConvertTimeFromUtc(datetimeFromBD, infotime);
Ответ 3
Чтобы помочь другим:
static void ChangeTimezone()
{
// Timezone string here:
foreach (TimeZoneInfo z in TimeZoneInfo.GetSystemTimeZones())
Console.WriteLine(z.Id);
// Use one of those timezone strings
DateTime localDt = DateTime.Today;
DateTime utcTime = localDt.ToUniversalTime();
TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time");
DateTime estDt = TimeZoneInfo.ConvertTimeFromUtc(utcTime, timeInfo);
return;
}
Ответ 4
var date = System.TimeZoneInfo.ConvertTimeFromUtc(
DateTime.UtcNow,
TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));