Согласен с startTime - обязательно.Я также прокомментировал DataTime.UtcNow - это правильный путь.
О вашей второй проблеме с задержкой в 1,2 секунды - это потому, что тики таймера мчатся рядом с тиками секунды.
1) Если ваш таймер сработает за 998 мс вместо 1000 мс, вы можете прочитать то же количество секунд, и это число останется до следующего такта.
2) Поскольку приложение не имеет приоритета в реальном временис точки зрения ОС, его можно удерживать в течение нескольких секунд (например, для рендеринга мультимедийных материалов другим приложением), и вы можете заметить пропуск в 1 секунду ...
Чтобы решить 1-ю причину и облегчить 2-ю попыткуувеличьте количество тиков, уменьшив интервал до 500 или 333.
Для более продвинутой стратегии, которая сохраняет ваши ресурсы, вы все равно должны использовать 1000 мс, но периодически синхронизировать свой таймер с каждым пересечением полсекунды, используя dateTime.Milliseconds.Это увеличит вероятность избежания проблемы гонок бок о бок без лишних тиков.