C#根据TimeZone调整DateTime

时间:2013-04-02 13:25:52

标签: c# datetime timezone

你好我根据用户的时区在军事时间内保存两次(例如:开始: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;
        }

谢谢!

1 个答案:

答案 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");