C#: Проверка DateTime. Теперь возвращает GMT + в 1 раз

Да, с SFINAE можно проверить, предоставляет ли данный класс действительно определенный метод. Вот рабочий код:

#include <iostream>

struct Hello
{
    int helloworld() { return 0; }
};

struct Generic {};    

// SFINAE test
template <typename T>
class has_helloworld
{
    typedef char one;
    struct two { char x[2]; };

    template <typename C> static one test( typeof(&C::helloworld) ) ;
    template <typename C> static two test(...);    

public:
    enum { value = sizeof(test<T>(0)) == sizeof(char) };
};

int main(int argc, char *argv[])
{
    std::cout << has_helloworld<Hello>::value << std::endl;
    std::cout << has_helloworld<Generic>::value << std::endl;
    return 0;
}

я только что протестировал его с Linux и gcc 4.1/4.3. Я не знаю, портативно ли это на другие платформы, запускающие различные компиляторы.

11
задан Andreas Grech 10 July 2009 в 09:38
поделиться

3 ответа

Используйте класс TimeZoneInfo, найденный в System.Core;

Для этого вы должны установить 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!

16
ответ дан 3 December 2019 в 01:53
поделиться

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

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

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

5
ответ дан 3 December 2019 в 01:53
поделиться

Это зависит от того, что вы подразумеваете под «часовым поясом 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, вам придется самостоятельно рассчитать летнее время. Честно говоря, самый простой способ сделать это - использовать простую таблицу поиска. Разработайте изменения летнего времени на следующие несколько лет, а затем напишите простой метод для возврата смещения в определенное время в формате UTC с жестко запрограммированным списком. Возможно, вам просто понадобится отсортированный List с известными изменениями и чередование от 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!");
}
15
ответ дан 3 December 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: