UTC - работа на один день позади - PullRequest
1 голос
/ 03 августа 2010

У меня есть приложение, которое записывает статистику. Когда пользователь отправляет свою статистику, информация сохраняется, а дата / время записывается как UTC, например,

В Великобритании, если бы я записал цифры в 03/08/2010 10:30, моя записанная дата / время были бы 03/08/2010 09:30, поскольку в настоящее время мы наблюдаем летнее время.

Если бы я был в Австралии, например, и в то же время я записывал свою статистику, моя записанная дата / время были бы 02/08/2010 23:30, так как я думаю, что они на 10 часов впереди.

Мое приложение должно генерировать статистический отчет в 7 утра каждое утро (по местному времени) для всех. Поэтому, когда он запускается, он делает что-то вроде этого:

var currentUtc = DateTime.UtcNow.AddDays(-1); // UTC date/time 24 hours from current

Эта дата (время игнорируется) затем используется для получения статистики из базы данных. Теперь это работает нормально для Великобритании. Это другие международные страны, я нахожу проблемы. В частности, Австралия.

У меня проблема с Австралией, которая на 10 часов вперед, поэтому мое приложение запускается примерно в 03/08/2010 22:00 по британскому времени для генерации отчета по 04/08/2010 07:00 по австралийскому времени. Так что происходит что-то вроде:

// the date/time at this point would be 03/08/2010 22:00 (UTC 03/08/2010 21:00)
var currentUtc = DateTime.UtcNow.AddDays(-1);
// so currentUtc is set to 02/08/2010 22:00 (which makes sense for UK, but not for Aussie)

Если вышеупомянутое было отчетом для кого-то в Великобритании, это означает, что он получит отчет за 02/08/2010 от 03.08.2010, который является правильным. Однако для Австралии (так как они на 10 часов вперед) это означает, что они получат отчет за 08/08/2010 от 04.08.2010, который будет на 2 дня позже.

Что должно произойти, когда мое приложение запускается в 22:00 часов 03.08.2010, оно должно генерировать отчет по Австралии, равный для 03.08.2010. Однако согласно приведенной выше настройке вы можете понять, почему этого не происходит.

Кажется, я не могу указать на это? У меня такое чувство, что это связано с тем, что я игнорирую время и просто полагаюсь на дату UTC, но я не уверен.

Ответы [ 2 ]

1 голос
/ 03 августа 2010

Поскольку день пользователя может не начинаться и не заканчиваться в полночь по UTC, в поле даты в базе данных также должно быть указано время.В противном случае ваш австралийский отчет будет содержать более 24 часов статистики.Диапазон дат с 08.02.2010 по 08.04.2010 выглядит странно, только если вы игнорируете время.Если вы включите время и перепроверьте диапазон, вы увидите, что он содержит 24 часа, как и предполагалось.Когда вы переведете его обратно в местное время для отображения отчета, все будет хорошо.

0 голосов
/ 03 августа 2010

несоответствие между «запросом в 7:00 по местному времени» и «UTC предыдущего дня» кажется странным, ИМХО - я бы предположил, что пользователь вместо этого хотел бы получить данные за предыдущий день, а «день» - по местному времени,поэтому диапазон, в котором вы хотите искать, - это DateTime.Today.AddDays (-1) до DateTime.Today (поэтому он охватывает «вчера, местное время»), и, поскольку вы сохраняете в UTC, мы просто добавляем ToUniversalTime длякаждый из них, чтобы получить их в UTC для запроса базы данных.

var startOfToday = DateTime.Today.ToUniversalTime();
var startOfYesterday = startOfToday.AddDays(-1);

var query = ...
...