using System;
namespace DTS.Common.Utilities
{
///
/// Public utilty class for manipulating Unix timestamps
/// Primarily exposed for the SDK
///
public class PTP1588Timestamps
{
private const int MIN_VALID_TIMESTAMP_YEAR = 1990;
///
/// tests time in seconds since 1,1,1970 to (unix time) to see whether the time should be valid or not
/// this is used by TestMetaDataList to control whether to show unix time or not for a dataset in a viewer
/// now it's also used by the CSV export to eliminate timestamps that occur before 1990
/// this was done because of a dataset in http://manuscript.dts.local/f/cases/33199/
/// which contained an invalid timestamp
///
/// time in seconds since 1970-1-1
/// true if the value is valid or not
public static bool IsValidTimeStamp(double unixTimeStampSeconds)
{
return UnixTimeStampToDateTimeLocal(unixTimeStampSeconds).Year > MIN_VALID_TIMESTAMP_YEAR;
}
///
/// Returns DateTime object from Unix timestamp in seconds
///
///
///
public static DateTime UnixTimeStampToDateTimeLocal(double unixTimeStampSec)
{
return UnixTimeStampToDateTimeLocal((decimal)unixTimeStampSec);
}
public static DateTime UnixTimeStampToDateTimeLocal(decimal unixTimeStampSec)
{
return UnitTimeStampToDateTimeLocal(unixTimeStampSec, (decimal)0);
}
public static DateTime UnitTimeStampToDateTimeLocal(double unixTimeStampSec, double ns)
{
var dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
dtDateTime = dtDateTime.AddSeconds(unixTimeStampSec).AddTicks(Convert.ToInt64(ns / 100));
return dtDateTime.ToLocalTime();
}
public static DateTime UnitTimeStampToDateTimeLocal(decimal unixTimeStampSec, decimal ns)
{
var dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
dtDateTime = dtDateTime.AddSeconds(Convert.ToDouble(unixTimeStampSec)).AddTicks(Convert.ToInt64(ns / 100));
return dtDateTime.ToLocalTime();
}
///
/// String representation in Unix timestamp is seconds past epoch
///
public static string ToDateTimeString(double unixTimeStampSec, double ns) =>
ToDateTimeString((decimal)unixTimeStampSec, (decimal)ns);
public static string ToDateTimeString(decimal unixTimeStampSec, decimal ns) =>
$"{UnixTimeStampToDateTimeLocal(unixTimeStampSec).ToUniversalTime():yyyy/MM/dd HH:mm:ss}:{ns,9:000000000}";
}
}