/* * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using System.Collections.Generic; using System.Linq; using NodaTime; using QuantConnect.Interfaces; namespace QuantConnect { /// /// Provides a means of centralizing time for various time zones. /// public class TimeKeeper : ITimeKeeper { private DateTime _utcDateTime; private readonly Dictionary _localTimeKeepers; /// /// Gets the current time in UTC /// public DateTime UtcTime { get { return _utcDateTime; } } /// /// Initializes a new instance of the class at the specified /// UTC time and for the specified time zones. Each time zone specified will cause the /// creation of a to handle conversions for that time zone. /// /// The initial time /// The time zones used to instantiate instances. public TimeKeeper(DateTime utcDateTime, params DateTimeZone[] timeZones) : this(utcDateTime, timeZones ?? Enumerable.Empty()) { } /// /// Initializes a new instance of the class at the specified /// UTC time and for the specified time zones. Each time zone specified will cause the /// creation of a to handle conversions for that time zone. /// /// The initial time /// The time zones used to instantiate instances. public TimeKeeper(DateTime utcDateTime, IEnumerable timeZones) { _utcDateTime = utcDateTime; _localTimeKeepers = timeZones.Distinct().Select(x => new LocalTimeKeeper(utcDateTime, x)).ToDictionary(x => x.TimeZone.Id); } /// /// Sets the current UTC time for this time keeper and the attached child instances. /// /// The current time in UTC public virtual void SetUtcDateTime(DateTime utcDateTime) { _utcDateTime = utcDateTime; foreach (var timeZone in _localTimeKeepers) { timeZone.Value.UpdateTime(utcDateTime); } } /// /// Gets the local time in the specified time zone. If the specified /// has not already been added, this will throw a . /// /// The time zone to get local time for /// The local time in the specifed time zone public DateTime GetTimeIn(DateTimeZone timeZone) { return GetLocalTimeKeeper(timeZone).LocalTime; } /// /// Gets the instance for the specified time zone /// /// The time zone whose we seek /// The instance for the specified time zone public LocalTimeKeeper GetLocalTimeKeeper(DateTimeZone timeZone) { LocalTimeKeeper localTimeKeeper; if (!_localTimeKeepers.TryGetValue(timeZone.Id, out localTimeKeeper)) { localTimeKeeper = new LocalTimeKeeper(UtcTime, timeZone); _localTimeKeepers[timeZone.Id] = localTimeKeeper; } return localTimeKeeper; } /// /// Adds the specified time zone to this time keeper /// /// public void AddTimeZone(DateTimeZone timeZone) { if (!_localTimeKeepers.ContainsKey(timeZone.Id)) { _localTimeKeepers[timeZone.Id] = new LocalTimeKeeper(_utcDateTime, timeZone); } } } }