Как конвертировать DateTime в конкретный часовой пояс? - программирование
Подтвердить что ты не робот

Как конвертировать 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; }
}
4b9b3361

Ответ 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"));