C#: убедитесь, что DateTime.Теперь возвращает GMT + 1 раз

Я использую DateTime.Now чтобы показать что-то в соответствии с сегодняшней датой, и при работе локально (Мальта, Европа) время отображается правильно (очевидно, из-за часового пояса), но, конечно, когда я загружаю его на свой хостинг-сервер (США),DateTime.Now не представляет правильный часовой пояс.

поэтому, в моем коде,как я могу конвертировать DateTime.Now чтобы правильно вернуть время из часового пояса GMT + 1 ?

3 ответов


используйте класс TimeZoneInfo, найденный в системе.Ядро;

вы должны установить DateTimeKind в DateTimeKind.Utc для этого.

DateTime MyTime = new DateTime(1990, 12, 02, 19, 31, 30, DateTimeKind.Utc);

DateTime MyTimeInWesternEurope = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(MyTime, "W. Europe Standard Time");

только если вы используете .Net 3.5, хотя!


это зависит от того, что вы подразумеваете под "GMT + 1 часовой пояс". Вы имеете в виду постоянно UTC+1, или вы имеете в виду UTC+1 или UTC+2 в зависимости от DST?

если вы используете .NET 3.5, используйте TimeZoneInfo чтобы получить соответствующий часовой пояс, используйте:

// Store this statically somewhere
TimeZoneInfo maltaTimeZone = TimeZoneInfo.FindSystemTimeZoneById("...");
DateTime utc = DateTime.UtcNow;
DateTime malta = TimeZoneInfo.ConvertTimeFromUtc(utc, maltaTimeZone );

вам нужно будет разработать Идентификатор системы для часового пояса Мальты, но вы можете сделать это легко, запустив этот код локально:

Console.WriteLine(TimeZoneInfo.Local.Id);

судя по Вашим комментариям, этот бит будет неактуальной, но только для других...

если вы не используя .NET 3.5, вам нужно будет самостоятельно разработать летнее время. Если честно, то простой способ сделать это будет простой таблицей поиска. Проработайте изменения DST в течение следующих нескольких лет, затем напишите простой метод для возврата смещения в определенное время UTC с этим жестко закодированным списком. Вы можете просто захотеть отсортировать List<DateTime> с известными изменениями в, и чередовать между 1 и 2 часами до ваша дата после последнего изменения:

// Be very careful when building this list, and make sure they're UTC times!
private static readonly IEnumerable<DateTime> DstChanges = ...;

static DateTime ConvertToLocalTime(DateTime utc)
{
    int hours = 1; // Or 2, depending on the first entry in your list
    foreach (DateTime dstChange in DstChanges)
    {
        if (utc < dstChange)
        {
            return DateTime.SpecifyKind(utc.AddHours(hours), DateTimeKind.Local);
        }
        hours = 3 - hours; // Alternate between 1 and 2
    }
    throw new ArgumentOutOfRangeException("I don't have enough DST data!");
}

Я не думаю, что вы можете установить свойство в своем коде, которое сделает DateTime.Теперь верните все, кроме текущего времени компьютера, на котором выполняется код. Если вы хотите иметь способ всегда получать другое время, вам, вероятно, нужно будет обернуть другую функцию. Вы можете сделать круговую поездку по UTC и добавить желаемое смещение:

private static DateTime GetMyTime()
{
    return DateTime.UtcNow.AddHours(1);
}

(пример кода обновлен после комментария Люка о внутренней работе DateTime.Сейчас)