Можно ли точно рассчитать разницу двух DateTimes на Windows Phone 7, даже если пользователь меняет часы на телефоне?

В настоящее время я делаю небольшое приложение таймера для Windows Phone 7 с возможностью регистрации данных, чтобы люди могли видеть, сколько времени они потратили на выполнение задачи в данный день.

Они должны иметь возможность закрывать приложение, отвечать на телефонные звонки и т. Д., И приложение будет продолжать считать (поскольку в WP7 нет многозадачности для сторонних производителей). В настоящее время я делаю это, сохраняя время последнего обновления таймера и вычисляя разницу между текущим временем.

Прямо сейчас у меня есть следующий код, который выполняется при обновлении таймера (каждую секунду / при активации приложения):

TimeSpan tempNowLastDiff = DateTime.Now - LastUpdateTime;
CumulativeTime += tempNowStartDiff;
LastUpdateTime = DateTime.Now;

Проблема в том, что если человек выходит из приложения и меняет часы, когда приложение запускается снова, CumulativeTime перестает быть точным. Если я переведу часы назад, это может привести к отрицательному значению TimeSpan, если я переведу часы вперед, это может привести к чрезмерно положительному значению TimeSpan.

Единственное решение, которое я могу придумать, - это 0 разницы, если tempNowStartDiff отрицательный, и просто предположить, что задача выполнялась на 24 часа каждый день, если положительный (что возможно, если, скажем, они отправятся в поездку).

Есть ли способ получить абсолютное время, на которое не повлияют изменения времени телефона? Если нет, есть ли способ проверить, изменилось ли время и на сколько?

Изменить: я загрузил копию кода таймера здесь с инструкциями о том, как воспроизвести проблему.


person Jacobite    schedule 06.02.2011    source источник
comment
Я не понимаю смысла этого делать. Все, что он измеряет, - это то, как долго ваше приложение не работает. Это совершенно случайное число. Если вы хотите измерить, как долго он работает, инициализируйте LastUpdateTime значением DateTime.Now сразу после активации.   -  person Hans Passant    schedule 06.02.2011
comment
Причина, по которой он измеряет, когда приложение не запущено, заключается в том, что оно позволяет людям отвечать на телефонные звонки, использовать другие приложения и т. в то же время.   -  person Jacobite    schedule 06.02.2011


Ответы (2)


Я бы использовал DateTime.UtcNow, чтобы иметь абсолютное значение, потому что DateTime.Now относится к текущему часовому поясу, и поэтому телефон может автоматически изменять время, если они меняют часовой пояс (из сети GSM).

person MatthieuGD    schedule 06.02.2011
comment
Привет, я пробовал это, однако изменение времени телефона по-прежнему делает то же самое. Вперед увеличивается, как бы далеко я ни выразился, назад - сколь угодно далеко назад. - person Jacobite; 06.02.2011
comment
Да, если пользователь меняет время вручную, кроме внешнего веб-сервиса, я не вижу большого решения. - person MatthieuGD; 07.02.2011

В этом случае единственное решение, которое я могу придумать, - это получить время откуда-то извне, например, с timeanddate.com.

person Shekhar_Pro    schedule 06.02.2011