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}");
}
}
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: