1

您好,我根据用户的时区(例如:开始:08:00 - 结束:14:00)在军事时间将两次存储在数据库中。我还将用户的时区以以下格式存储在数据库中“中部时间(美国和加拿大)(格林威治标准时间 -06:00)”

因此,在上面的示例中,用户的安静时间是中部时间上午 8:00 到下午 2:00。如果用户输入 12:00 - 10:00,我只需在较小的数字上添加一天,即 2013 年 1 月 1 日下午 12:00 - 2013 年 1 月 2 日上午 10:00。我正在使用以下方法查看服务器时间是否在该范围内。我的问题是,我怎样才能通过时区并确保我看到它是否在用户设定的时区范围内?

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

谢谢!

4

1 回答 1

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");
于 2013-04-02T18:18:49.477 回答