我有一些记录,我只想展示那一天,所以如果它是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日。
我在想我必须使用偏移量,但我不是如何使用它。
答案 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()操作发生在本地时区,因此在夏令时等方面并不完美。