你好我根据用户的时区在军事时间内保存两次(例如:开始:08:00-结束:14:00)。我还将用户的时区保存在数据库中,格式如下:“中部时间(美国和加拿大)(GMT -06:00)”
因此,在上面的示例中,用户的安静时间是中部时间上午8:00到下午2:00。如果用户输入12:00 - 10:00我简单地将一天添加到较低的数字,因此它将是1/1/2013 12:00 pm - 1/2/2013 10:00 am。我使用以下方法来查看服务器时间是否在该范围内。我的问题是,我如何传递时区并确保在用户设定的时区内看到它是否在该范围内?
private static bool IsInQuietTime(string startDate, string endDate)
{
if (string.IsNullOrWhiteSpace(startDate) || string.IsNullOrWhiteSpace(endDate)) return false;
var now = DateTime.Now;
var sDate = DateTime.Parse(now.ToString("M/d/yyyy " + startDate));
var eDate = DateTime.Parse(now.ToString("M/d/yyyy " + endDate));
if (eDate <= sDate)
eDate = eDate.AddDays(1);
return now.Ticks >= sDate.Ticks && now.Ticks <= eDate.Ticks;
}
谢谢!
答案 0 :(得分:1)
您将如何执行此操作:
private static bool NowInTimeRange(string startTimeString, string endTimeString, string timeZoneId)
{
// convert to timespan
var startTime = TimeSpan.Parse(startTimeString);
var endTime = TimeSpan.Parse(endTimeString);
// what time is it in the timezone specified?
var now = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, timeZoneId);
// if they are in order, are we between the times specified?
if (startTime <= endTime)
return now.TimeOfDay >= startTime && now.TimeOfDay <= endTime;
// when not in order, just see if either one of them matches.
return now.TimeOfDay >= startTime || now.TimeOfDay <= endTime;
}
注意,我不会通过添加一天来操纵时间 - 我只是依靠比较来按照用户表达的方式工作。
此外,您所说的为用户存储的值不是时区ID。这来自TimeZoneInfo.DisplayName
。确保您使用的是从TimeZoneInfo.Id
获得的值。
以下是使用此方法的方法:
var quietTime = NowInTimeRange("08:00", "14:00", "Central Standard Time");
如果时间不按顺序,它也会同样有效:
var quietTime = NowInTimeRange("12:00", "10:00", "Central Standard Time");