// Copyright © 2022 The CefSharp Authors. All rights reserved. // // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. using System; namespace CefSharp.Internals { /// public sealed class BaseTimeConverter : IBaseTimeConverter { private static DateTime UtcWindowsEpoch = DateTime.SpecifyKind(DateTime.Parse("1601-01-01"), DateTimeKind.Utc); /// DateTime IBaseTimeConverter.FromBaseTimeToDateTime(long val) { //DateTime.MaxTicks - DateTime.FileTimeOffset const long MaxFileTime = 2650467743999999999; //DateTime.FileTimeOffset const long FileTimeOffset = 504911232000000000; var fileTime = val * 10; if (fileTime > MaxFileTime) { return DateTime.MaxValue; } if (fileTime < 0) { var universalTicks = fileTime + FileTimeOffset; if(universalTicks <= 0) { return DateTime.MinValue.ToLocalTime(); } return new DateTime(universalTicks, DateTimeKind.Utc).ToLocalTime(); } return DateTime.FromFileTime(fileTime); } /// long IBaseTimeConverter.FromDateTimeToBaseTime(DateTime dateTime) { //DateTime.FileTimeOffset const long FileTimeOffset = 504911232000000000; var utcDateTime = dateTime.ToUniversalTime(); // FileTime doesn't support less than Epoch if(utcDateTime < UtcWindowsEpoch) { var ticks = utcDateTime.Ticks - FileTimeOffset; return ticks / 10; } // Same as calling ToFileTime, this to me is a little // more self descriptive of what's going on. return utcDateTime.ToFileTimeUtc() / 10; } } }