예제 #1
0
        static void Main(string[] args)
        {
            if (args.Length < 1 || args.Length > 2)
            {
                Console.WriteLine("Usage: NodaDump <source> [zone]");
                Console.WriteLine("The source may be a local nzd file, or a URL, e.g. http://nodatime.org/tzdb/tzdb2015e.nzd");
                return;
            }
            var sourceData = LoadSource(args[0]);
            var source = TzdbDateTimeZoneSource.FromStream(new MemoryStream(sourceData));
            var provider = new DateTimeZoneCache(source);

            if (args.Length == 2)
            {
                DumpZone(provider[args[1]]);
            }
            else
            {
                // Ids is already sorted
                foreach (var id in provider.Ids)
                {
                    DumpZone(provider[id]);
                    Console.Write("\r\n");
                }
            }
        }
        private static async Task<CurrentTzdbProvider> DownloadAsync()
        {
            using (var client = new HttpClient())
            {
                var latest = new Uri((await client.GetStringAsync("http://nodatime.org/tzdb/latest.txt")).TrimEnd());
                var fileName = latest.Segments.Last();
                var path = Path.Combine(Path.GetTempPath(), fileName);

                if (!File.Exists(path))
                {
                    using (var httpStream = await client.GetStreamAsync(latest))
                    using (var fileStream = File.Create(path))
                    {
                        await httpStream.CopyToAsync(fileStream);
                    }
                }

                using (var fileStream = File.OpenRead(path))
                {
                    var source = TzdbDateTimeZoneSource.FromStream(fileStream);
                    var provider = new DateTimeZoneCache(source);
                    return new CurrentTzdbProvider(provider, source.Aliases);
                }
            }
        }
예제 #3
0
 public void SourceIsNotAskedForUtcIfAdvertised()
 {
     var source = new TestDateTimeZoneSource("Test1", "Test2", "UTC");
     var provider = new DateTimeZoneCache(source);
     var zone = provider[DateTimeZone.UtcId];
     Assert.IsNotNull(zone);
     Assert.IsNull(source.LastRequestedId);
 }
예제 #4
0
 private static void CreateTextDump(TzdbDateTimeZoneSource source, string file)
 {
     var provider = new DateTimeZoneCache(source);
     using (var writer = File.CreateText(file))
     {
         provider.Dump(writer);
     }
 }
예제 #5
0
        public void CachingForPresentValues()
        {
            var source = new TestDateTimeZoneSource("Test1", "Test2");
            var provider = new DateTimeZoneCache(source);
            var zone1a = provider["Test1"];
            Assert.IsNotNull(zone1a);
            Assert.AreEqual("Test1", source.LastRequestedId);

            // Hit up the cache (and thus the source) for Test2
            Assert.IsNotNull(provider["Test2"]);
            Assert.AreEqual("Test2", source.LastRequestedId);

            // Ask for Test1 again
            var zone1b = provider["Test1"];
            // We won't have consulted the source again
            Assert.AreEqual("Test2", source.LastRequestedId);

            Assert.AreSame(zone1a, zone1b);
        }
예제 #6
0
        public static IDateTimeZoneProvider LoadTzdb(string path = null)
        {
            IDateTimeZoneProvider provider;

            // Load the time zone database from a file, if specified.
            path = path ?? UtilityConfiguration.Active.TimeZoneDB;
            if (!string.IsNullOrWhiteSpace(path))
            {
                Uri uri = new Uri(path.TrimStart('\\', '/'), UriKind.RelativeOrAbsolute);
                if (!uri.IsAbsoluteUri)
                    uri = new Uri(UtilityExtensions.AppDomainBaseUri, uri);

                // If the URI is a file, load it from the file system, otherwise download it
                if (uri.IsFile)
                {
                    path = uri.LocalPath;
                    if (!File.Exists(path))
                        throw new FileNotFoundException(
                            // ReSharper disable once AssignNullToNotNullAttribute
                            string.Format(Resources.TimeHelper_TimeHelper_TimeZoneDB_Not_Found, path));

                    try
                    {
                        using (FileStream stream = File.OpenRead(path))
                            // ReSharper disable once AssignNullToNotNullAttribute
                            provider = new DateTimeZoneCache(TzdbDateTimeZoneSource.FromStream(stream));
                    }
                    catch (Exception e)
                    {
                        // ReSharper disable once AssignNullToNotNullAttribute
                        throw new FileLoadException(
                            string.Format(Resources.TimeHelper_TimeHelper_TimeZoneDB_Failed, path),
                            e);
                    }
                }
                else
                {
                    path = uri.AbsoluteUri;
                    try
                    {
                        // ReSharper disable AssignNullToNotNullAttribute
                        WebRequest request = WebRequest.Create(uri);
                        using (WebResponse response = request.GetResponse())
                        using (Stream stream = response.GetResponseStream())
                            provider = new DateTimeZoneCache(TzdbDateTimeZoneSource.FromStream(stream));
                        // ReSharper restore AssignNullToNotNullAttribute
                    }
                    catch (Exception e)
                    {
                        // ReSharper disable once AssignNullToNotNullAttribute
                        throw new FileLoadException(
                            string.Format(Resources.TimeHelper_TimeHelper_TimeZoneDB_Failed, path),
                            e);
                    }
                }
            }
            // ReSharper disable once AssignNullToNotNullAttribute
            else
            // ReSharper disable once AssignNullToNotNullAttribute
                provider = DateTimeZoneProviders.Tzdb;

            Debug.Assert(provider != null);

            return provider;
        }
예제 #7
0
 public void UtcIsReturnedInIdsIfAdvertisedByProvider()
 {
     var source = new TestDateTimeZoneSource("Test1", "Test2", "UTC");
     var provider = new DateTimeZoneCache(source);
     Assert.True(provider.Ids.Contains(DateTimeZone.UtcId));
 }
예제 #8
0
 public void SourceIsNotAskedForUnknownIds()
 {
     var source = new TestDateTimeZoneSource("Test1", "Test2");
     var provider = new DateTimeZoneCache(source);
     Assert.Throws<DateTimeZoneNotFoundException>(() => { var ignored = provider["Unknown"]; });
     Assert.IsNull(source.LastRequestedId);
 }
예제 #9
0
 public void VersionIdPassThrough()
 {
     var provider = new DateTimeZoneCache(new TestDateTimeZoneSource("Test1", "Test2") { VersionId = "foo" });
     Assert.AreEqual("foo", provider.VersionId);
 }
예제 #10
0
 public void EmptyIdAccepted()
 {
     var provider = new DateTimeZoneCache(new TestDateTimeZoneSource("Test1", "Test2"));
     Assert.Throws<DateTimeZoneNotFoundException>(() => { var ignored = provider[""]; });
 }
예제 #11
0
 public void NullIdRejected()
 {
     var provider = new DateTimeZoneCache(new TestDateTimeZoneSource("Test1", "Test2"));
     // GetType call just to avoid trying to use a property as a statement...
     Assert.Throws<ArgumentNullException>(() => provider[null].GetType());
 }
예제 #12
0
 public void FixedOffsetZeroReturnsUtc()
 {
     string id = "UTC+00:00";
     var source = new TestDateTimeZoneSource("Test1", "Test2", id);
     var provider = new DateTimeZoneCache(source);
     DateTimeZone zone = provider[id];
     Assert.AreEqual(DateTimeZone.Utc, zone);
     Assert.IsNull(source.LastRequestedId);
 }
예제 #13
0
 public void FixedOffsetUncached()
 {
     string id = "UTC+05:26";
     var source = new TestDateTimeZoneSource("Test1", "Test2");
     var provider = new DateTimeZoneCache(source);
     DateTimeZone zone1 = provider[id];
     DateTimeZone zone2 = provider[id];
     Assert.AreNotSame(zone1, zone2);
     Assert.AreEqual(zone1, zone2);
 }
예제 #14
0
 public void FixedOffsetSucceedsWithoutConsultingSourceWhenAdvertised()
 {
     string id = "UTC+05:30";
     var source = new TestDateTimeZoneSource("Test1", "Test2", id);
     var provider = new DateTimeZoneCache(source);
     DateTimeZone zone = provider[id];
     Assert.AreEqual(DateTimeZone.ForOffset(Offset.FromHoursAndMinutes(5, 30)), zone);
     Assert.AreEqual(id, zone.Id);
     Assert.IsNull(source.LastRequestedId);
 }