如何获取一整天的所有记录?

时间:2011-07-06 16:48:19

标签: c# datetime timezone

我有一些记录,我只想展示那一天,所以如果它是7月6日那应该是

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

假设我的记录的截止日期为7月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

那是UTC时间凌晨2点。这存储在数据库中(我只存储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月7日,但用户仍然是7月6日。

我在想我必须使用偏移量,但我不是如何使用它。

2 个答案:

答案 0 :(得分:3)

听起来你需要采取当地的时间界限,例如:当地日的开始,将它们转换为UTC,然后按此过滤。

请注意,您的初始示例仅显示7月6日上午 - 上午12点至中午12点。目前尚不清楚这是否是你想要的。

请注意,在某些时区,并非所有日期都从午夜开始 - 如果在午夜发生时发生DST更改,则该日实际上可能从凌晨1点开始。

编辑:只是为了清楚......

您需要以某种方式从用户那里获得年,月和日。如果在UI中指定了,则可以使用以下代码:

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);

请注意,此不会考虑午夜并非总是发生的时区。

答案 1 :(得分:0)

注意:我假设您已根据评论知道用户时区......

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()操作发生在本地时区,因此在夏令时等方面并不完美。