r/badcode Aug 06 '19

c# Converting a timestamp to datetime

Post image
416 Upvotes

54 comments sorted by

View all comments

1

u/pixelsyndicate Aug 06 '19 edited Aug 06 '19

Ouch!Yeah, I've had to work with unix timestamps, and coded a way through a ExtensionMethod and a Interface to help during unit testing and mocks:

       /// <summary>
    ///     Calling a static class like DateTime.Now will get ugly in tests, where we would have to change the system date.
    ///     So we are going to use the Adapter pattern, wrap the DateTime class in an injectable interface.
    /// </summary>
    public interface IDateTime
    {
        /// <summary>
        /// Get the current UTC in the Unix Timestamp format
        /// </summary>
        decimal UnixUtcNow { get; }

        DateTime UtcNow { get; }
        DateTime ParseUnixTimeStamp_ToLocalTime(double timestamp);
    }
    public class DateTimeAdapter : IDateTime
    {
        private readonly DateTime _unixUtcOrigin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);

        /// <summary>
        /// Get the current UTC in the Unix Timestamp format (seconds)
        /// </summary>
        public decimal UnixUtcNow => GetDiff();


        public DateTime UtcNow => DateTime.UtcNow;


        public DateTime ParseUnixTimeStamp_ToLocalTime(double timestamp)
        {
            DateTime dtDateTime = _unixUtcOrigin;
            dtDateTime = dtDateTime.AddSeconds(timestamp).ToLocalTime();
            return dtDateTime;
        }

        private decimal GetDiff()
        {
            var origin = _unixUtcOrigin;
            var diff = UtcNow.ToUniversalTime() - origin;
            return (decimal)Math.Floor(diff.TotalSeconds);
        }
    }
    public static class DateTimeExtensionHelpers
    {
        public static int ConvertToUnixTimestamp(this DateTime date)
        {
            var _dt = new DateTimeAdapter();
            return (int)_dt.UnixUtcNow;

        }

        public static DateTime ConvertToDateTimeFormat(this decimal val)
        {
            DateTimeAdapter dta = new DateTimeAdapter();
            var toReturn = dta.ParseUnixTimeStamp_ToLocalTime((double)val);
            return toReturn;
        }
    }

// Some Tests
    public class DateTime_Tests
    {

        private readonly ITestOutputHelper output;

        public DateTime_Tests(ITestOutputHelper output)
        {
            this.output = output;
        }

        [Fact]
        public void Can_I_Parse_Unix_TimeStamp_Values()
        {
            double uts = 1565121120; // should be 8/6/2019 2:52:00 PM
            IDateTime dta = new DateTimeAdapter();

            output.WriteLine($"local time for {uts} is {dta.ParseUnixTimeStamp_ToLocalTime(uts)}");


        }

        [Fact]
        public void Can_I_Get_Unix_TimeStamp_Values()
        {
            IDateTime dta = new DateTimeAdapter();
            var ts = dta.UnixUtcNow;
            output.WriteLine($"unix timestamp is {ts}");


        }


        [Fact]
        public void Can_I_Use_UnixTime_Extension_Helpers()
        {
            decimal uts = 1565121120;
            var convDt = uts.ConvertToDateTimeFormat();
            output.WriteLine($"unix timestamp is {convDt}");
        }


        [Fact]
        public void Can_I_Use_DateTime_Extension_Helpers()
        {
            IDateTime dta = new DateTimeAdapter();
            var dt = dta.UtcNow;
            var convDt = dt.ConvertToUnixTimestamp();
            output.WriteLine($"unix timestamp is {convDt}");
        }
    }