Files
DP44/Common/DTS.Common.Utilities/PTP1588Timestamps.cs
2026-04-17 14:55:32 -04:00

60 lines
2.9 KiB
C#

using System;
namespace DTS.Common.Utilities
{
/// <summary>
/// Public utilty class for manipulating Unix timestamps
/// Primarily exposed for the SDK
/// </summary>
public class PTP1588Timestamps
{
private const int MIN_VALID_TIMESTAMP_YEAR = 1990;
/// <summary>
/// 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
/// </summary>
/// <param name="unixTimeStampSeconds">time in seconds since 1970-1-1</param>
/// <returns>true if the value is valid or not</returns>
public static bool IsValidTimeStamp(double unixTimeStampSeconds)
{
return UnixTimeStampToDateTimeLocal(unixTimeStampSeconds).Year > MIN_VALID_TIMESTAMP_YEAR;
}
/// <summary>
/// Returns DateTime object from Unix timestamp in seconds
/// </summary>
/// <param name="unixTimeStampSec"></param>
/// <returns></returns>
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();
}
/// <summary>
/// String representation in Unix timestamp is seconds past epoch
/// </summary>
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}";
}
}