Как определить, находится ли сейчас (utc) в диапазоне заданных дней недели и времени дня в формате ISO 8601 - PullRequest
0 голосов
/ 19 мая 2018

Я сталкиваюсь с этим вопросом о том, как определить, попадает ли DateTime.UtcNow (например, 2018-01-01T20: 00: 00Z) в данный диапазон дней и времен, которые находятся в другом часовом поясе.Конкретные даты не указаны, только дни недели и время суток.Время указано в стандартном формате ISO 8601.

Чтобы упростить этот вопрос, может быть, как проверить, находится ли время UTC в Китае в рабочие часы.

Например, указанный день и временной интервал дан кем-то из Китая вчасовой пояс +08: 00, это может быть: FromDayOfWeek = "Friday", FromTimeOfDay = "17:00:00+8:00", ToDayOfWeek = "Monday", ToTimeOfWeek = "08:00:00+8:00". Мне нужно определить, находится ли "сейчас" в Китае какое-то время между заданным диапазоном (пятница 17: 00: 00 + 8: 00 - понедельник 08: 00: 00 + 8: 00).

Я застрял в том, как преобразовать DateTime и получить день недели по местному времени, так как 2018-01-01T20: 00: 00Z - понедельник в Великобритании, но вВ то же время, поскольку в Китае +08: 00, в Китае уже вторник.

Мой подход:

// parse the time to get the zone first (+08:00)
TimeSpan ts = TimeSpan.Parse("-08:00");

// Create a custom time zone since the time zone id is not given, and cannot be searched by SearchTimeZoneById
TimeZoneInfo tzi = TimeZoneInfo.CreateCustomTimeZone(zoneId, ts, displayName, standardName);
DateTime localDateTime = TimeZoneInfo.ConvertTime(Date.UtcNow, tzi);

String localDay = localDateTime.DayOfWeek;

// Determine if localDay is between FromDayOfWeek and ToDayOfWeek
// cast the days to integers from 1 (Monday) to 7 (Sunday)  
// create an array of days in integar days = [5, 6, 7, 1]
// if days.contains(localDays), check the times
...

Кто-нибудь может предложить какие-то лучшие решения?Я не уверен, работает ли мой, и есть пробелы в том, как обращаться с летним временем, так как зона изменится, и как проверить диапазон времени.Я новичок в C #, любые предложения библиотек, которые я могу использовать, это здорово!

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Согласно комментариям к @ Moffen's answer , вы хотите только проверить, находится ли Now в определенном DayOfWeek диапазоне:

public void CheckAll(List<SomeClass> spans)
{
    var chinaTZ = TimeZoneInfo.CreateCustomTimeZone(zoneID, TimeSpan.Parse("-08:00"), displayName, standardName);

    var nowInChina = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, chinaTZ);

    foreach ( var span in spans )
    {
        if (InRange(nowInChina, span.startDay, span.endDay))
            // Do something on success 
            // Check for valid times here
            ;
        else
            // Do something on Failure
            ;
    }
}
public bool InRange(DateTime dateToCheck, DayOfWeek startDay, DayOfWeek endDay)
{
    // Initialise as one day prior because first action in loop is to increment current
    var current = (int)startDay - 1;

    do
    {
        // Move to next day, wrap back to Sunday if went past Saturday
        current = (current + 1) % 7;

        if (dateToCheck.DayOfWeek == (DayOfWeek)current)
            return true;

    } while (current != (int)endDay);

    return false;
}
0 голосов
/ 19 мая 2018

Вместо того, чтобы конвертировать время начала и окончания из UTC, просто конвертируйте другое время в UTC

    TimeZoneInfo chinaTimeZone = TimeZoneInfo.CreateCustomTimeZone(zoneID, TimeSpan.Parse("-08:00"), displayName, standardName);

    DateTime FromTime = new DateTime(2018, 0, 19, 13, 0, 0); // year, month, day, hour, minute, second : Friday 1pm
    DateTime ToTime = new DateTime(2018, 0, 21, 1, 0, 0); // year, month, day, hour, minute, second : Monday 1am

    DateTime nowinUTC = DateTime.UtcNow;
    DateTime nowInChina = TimeZoneInfo.ConvertTimeFromUtc(nowinUTC, chinaTimeZone);

    if(FromTime< nowInChina && ToTime> nowInChina)
    {
        // Time is within the from and two times
    }
...