我有一些记录,我只想显示那天,所以如果是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日。
我想我必须使用偏移量,但我不知道如何使用它
听起来你需要把你的本地时间边界,例如当地一天的开始,转换成UTC,然后过滤。
请注意,您的初始示例仅显示7月6日的前半部分- 12am到12pm。还不清楚这是不是你想要的。
请注意,在某些时区,不是所有的日子都从午夜开始——如果夏令时改变发生在午夜发生的时候,一天实际上可能从凌晨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);
请注意,这个并没有考虑午夜不经常发生的时区
注意:根据评论,我假设您已经知道用户的时区…
我得到"right now"。2转换为用户的时区。3获得用户时区的日边界。将边界转换为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()操作发生在本地时区,因此对于夏令时等来说,它并不完美。