Как получить результат datetime из метода кварцевого планировщика «CronExpression.GetNextValidTimeAfter (DateTimeOffset)» в формате UTC ± 00: 00? - PullRequest
2 голосов
/ 29 января 2020

Я передаю время UTC ± 00: 00 методу GetNextValidTimeAfter () в планировщике кварца, чтобы вычислить следующее допустимое время для планирования на основе указанного выражения c cron, но так как мое системное время находится в PST, результат возвращается в формате UTC-08: 00, но мне нужно получить результат в формате UTC ± 00: 00.

CronExpression expression = new CronExpression("0 0 1 1/1 * ? *"); //Daily 1 AM
DateTime EasternTimeUTC = new DateTime(2020, 3, 7, 6, 00, 0); //Corresponding UTC time for EST time 7th March 1 AM
DateTimeOffset? nextFireUTCTime = expression.GetNextValidTimeAfter(EasternTimeUTC); 

nextFireUTCTime возвращает следующую действительную дату / время как 3/8/2020 9:00 AM, которая в формате UTC-08: 00, поскольку системный часовой пояс указан в формате PST, но мне нужен результат в формате UTC ± 00: 00, который должен быть 3/8/2020 6:00 AM. Как мне получить это значение?

Поскольку я не смог найти правильного решения вышеуказанной проблемы, я попробовал следующее.

Моя система всегда будет находиться в часовом поясе PST, что означает результат, который я получаю из метода кварцевого планировщика GetNextValidTimeAfter (), всегда будет возвращаться в формате UTC-08: 00. Чтобы получить выходные данные в формате часового пояса EST, я вычитаю 8 или 7 часов из результата, основанного на летнем времени, но это решение не работает, когда запланированное время падает с 8 марта 12.00 до 1.59.

CronExpression expression = new CronExpression("0 0 1 1/1 * ? *"); 
DateTime EasternTimeUTC = new DateTime(2020, 3, 7, 6, 00, 0); 
DateTimeOffset? nextFireUTCTime = expression.GetNextValidTimeAfter(EasternTimeUTC); 
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime UTCNextTime1 = DateTime.UtcNow;
if (timeZone.IsDaylightSavingTime(nextFireUTCTime.GetValueOrDefault()))
   {
            UTCNextTime1 = nextFireUTCTime.Value.DateTime.AddHours(-7);
   }
else
   {
            UTCNextTime1 = nextFireUTCTime.Value.DateTime.AddHours(-8);
   }

1 Ответ

0 голосов
/ 29 января 2020

Убедитесь, что DateTime, который вы передаете, равен UT C и установите часовой пояс CronExpression

CronExpression expression = new CronExpression("0 0 1 1/1 * ? *"); //Daily 1 AM
expression.TimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime EasternTimeUTC = new DateTime(2020, 3, 7, 6, 00, 0, DateTimeKind.Utc); //Corresponding UTC time for EST time 7th March 1 AM
DateTimeOffset? nextFireUTCTime = expression.GetNextValidTimeAfter(EasternTimeUTC);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...