Как получить все записи за весь день? - PullRequest
1 голос
/ 06 июля 2011

У меня есть некоторые записи, и я хочу показать только этот день, поэтому, если это 6 июля, это должно быть

7/6/2011 12:00:00 AM to 7/6/2011 11:59:59 AM

Скажем, у меня есть запись с датой исполнения 6 июля 7 вечера (мой местныйвремя)

07:00:00 p.m. Wednesday July 6, 2011 in Canada/Pacific converts to
02:00:00 a.m. Thursday July 7, 2011 in UTC

Это время 2:00 UTC.Это хранится в базе данных (я сохраняю только даты UTC, а затем использую UTC, чтобы получить нужные мне записи, а затем преобразовать их в местный часовой пояс)

Теперь у меня есть этот код

    DateTime startDate = DateTime.UtcNow.Date;


    DateTime endDate = DateTime.UtcNow.Date.AddSeconds(86399);

    return new DateFilterRange(startDate, endDate);

// result
7/6/2011 12:00:00 AM to 7/6/2011 11:59:59 AM

Конечноэто не захватывает вышеупомянутую задачу, потому что в БД запись хранится как 7 июля, но пользователь все еще находится в 6 июля.

Я думаю, что я должен использовать смещение как, но я не какиспользуйте это.

Ответы [ 2 ]

3 голосов
/ 06 июля 2011

Звучит так, как будто вам нужно взять границы вашего местного времени, например, начало местного дня, конвертируйте их в UTC, а затем фильтруйте по ним.

Обратите внимание, что ваш первоначальный пример показывает только первую половину 6 июля - с 12:00 до 12:00. Непонятно, хочешь ли ты этого.

Имейте в виду, что в некоторых часовых поясах не все дни начинаются в полночь - если изменение DST происходит, когда в полночь наступит , день может фактически начаться в 1 час ночи.

РЕДАКТИРОВАТЬ: Просто чтобы быть ясно ...

Вам нужно каким-то образом получить год, месяц и день от пользователя. Если это указано в пользовательском интерфейсе, вы можете использовать этот код:

DateTime localDate = new DateTime(year, month, day, 0, 0, 0,
                                  DateTimeKind.Unspecified);

В противном случае вам понадобится что-то вроде:

// Work out the current date in the *user's* time zone
DateTime localDate = TimeZoneInfo.ConvertTime(DateTime.UtcNow, timeZone).Date;

// And then convert that "start of day" back to UTC
DateTime utcStart = TimeZoneInfo.ConvertTimeToUtc(localDate, timeZone);
DateTime utcEnd = TimeZoneInfo.ConvertTimeToUtc(localDate.AddDays(1),
                                                timeZone);

Обратите внимание, что это не учитывает часовые пояса, где не всегда бывает полночь.

0 голосов
/ 06 июля 2011

Примечание: я предполагаю, что вы уже знаете часовой пояс пользователей, основываясь на комментариях ...

1 получите "прямо сейчас".2 преобразовать в часовой пояс пользователя.3 получить границы дня в часовом поясе пользователя.4 преобразуйте границы в время UTC.

DateTime userDayStart = TimeZoneInfo.ConvertTimeFromUtc(
    DateTime.UtcNow,
    usersTimeZone
).Date;

DateTime utcStart = TimeZoneInfo.ConvertTimeToUtc(
    userDayStart,
    usersTimeZone
);

DateTime utcEnd = TimeZoneInfo.ConvertTimeToUtc(
    userDayStart.AddDays(1),
    usersTimeZone
);

Конечно, операции .Date и .AddDays () происходят в местном часовом поясе, поэтому они не будут идеальными в отношении летнего времени и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...