using SptCommon.Annotations; namespace Core.Utils; [Injectable(InjectionType.Singleton)] public class TimeUtil { public const int OneHourAsSeconds = 3600; /// /// Formats the time part of a date as a UTC string. /// /// The date to format in UTC. /// The formatted time as 'HH-MM-SS'. public string FormatTime(DateTimeOffset dateTime) { var hour = Pad(dateTime.ToUniversalTime().Hour); var minute = Pad(dateTime.ToUniversalTime().Minute); var second = Pad(dateTime.ToUniversalTime().Second); return $"{hour}-{minute}-{second}"; } /// /// Formats the date part of a date as a UTC string. /// /// The date to format in UTC. /// The formatted date as 'YYYY-MM-DD'. public string FormatDate(DateTimeOffset dateTime) { var day = Pad(dateTime.ToUniversalTime().Day); var month = Pad(dateTime.ToUniversalTime().Month); var year = Pad(dateTime.ToUniversalTime().Year); return $"{year}-{month}-{day}"; } /// /// Gets the current date as a formatted UTC string. /// /// The current date as 'YYYY-MM-DD'. public string GetDate() { return FormatDate(DateTimeOffset.UtcNow); } /// /// Gets the current time as a formatted UTC string. /// /// The current time as 'HH-MM-SS'. public string GetTime() { return FormatTime(DateTimeOffset.UtcNow); } /// /// Gets the current timestamp in seconds in UTC. /// /// The current timestamp in seconds since the Unix epoch in UTC. public long GetTimeStamp() { return DateTimeOffset.Now.ToUnixTimeSeconds(); } /// /// Gets the start of day timestamp for the given date /// /// datetime to get the time stamp for, if null it uses current date. /// Unix epoch for the start of day of the calculated date public long GetStartOfDayTimeStamp(long? timestamp) { DateTime now = timestamp.HasValue ? DateTimeOffset.FromUnixTimeMilliseconds(timestamp.Value).DateTime : DateTime.Now; DateTime startOfDay = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0); return ((DateTimeOffset)startOfDay).ToUnixTimeMilliseconds(); } /// /// Get timestamp of today + passed in day count /// /// Days from now /// public long GetTimeStampFromNowDays(int daysFromNow) { return DateTimeOffset.UtcNow.AddDays(daysFromNow).ToUnixTimeSeconds(); } /// /// Get timestamp of today + passed in hour count /// /// /// public long GetTimeStampFromNowHours(int hoursFromNow) { return DateTimeOffset.UtcNow.AddHours(hoursFromNow).ToUnixTimeSeconds(); } /// /// Gets the current time in UTC in a format suitable for mail in EFT. /// /// The current time as 'HH:MM' in UTC. /// GetTimeMailFormat public string GetTimeMailFormat() { return DateTimeOffset.UtcNow.ToString("HH:mm"); } /// /// Gets the current date in UTC in a format suitable for emails in EFT. /// /// The current date as 'DD.MM.YYYY' in UTC. public string GetDateMailFormat() { return DateTimeOffset.UtcNow.ToString("dd.MM.yyyy"); } /// /// Converts a number of hours into seconds. /// /// The number of hours to convert. /// The equivalent number of seconds. public int GetHoursAsSeconds(int hours) { return OneHourAsSeconds * hours; } /// /// Gets the time stamp of the start of the next hour in UTC /// /// Time stamp of the next hour in unix time seconds public long GetTimeStampOfNextHour() { DateTime now = DateTime.Now; TimeSpan timeUntilNextHour = TimeSpan.FromMinutes(60 - now.Minute) .Subtract(TimeSpan.FromSeconds(now.Second)) .Subtract(TimeSpan.FromMilliseconds(now.Millisecond)); var time = ((DateTimeOffset)now.Add(timeUntilNextHour)).ToUnixTimeSeconds(); return time; } /// /// Returns the current days timestamp at 00:00 /// e.g. current time: 13th March 14:22 will return 13th March 00:00 /// /// Timestamp public long GetTodayMidnightTimeStamp() { DateTime now = DateTime.Now; int hours = now.Hour; int minutes = now.Minute; // If minutes greater than 0, subtract 1 hour if (minutes > 0) { hours--; } // Create a new DateTime with the last full hour, 0 minutes, and 0 seconds DateTime lastFullHour = new DateTime(now.Year, now.Month, now.Day, hours, 0, 0); return ((DateTimeOffset)lastFullHour).ToUnixTimeMilliseconds(); } /// /// Pads a number with a leading zero if it is less than 10. /// /// The number to pad. /// The padded number as a string. private static string Pad(int number) { return number.ToString().PadLeft(2, '0'); } /// /// Takes a timestamp and converts to its date with Epoch /// /// /// public DateTime GetDateTimeFromTimeStamp(long timeStamp) { return DateTimeOffset.FromUnixTimeMilliseconds(timeStamp).DateTime; } /// /// Takes a date and gets difference between Epoch time and time provided resulting in a timestamp (date defaults to utcnow) /// This attempts to mimic gettime() in js /// /// /// public long GetTimeStampFromEpoch(DateTime? date = null) { var dateToCompare = date ?? DateTime.UtcNow; return (long)(dateToCompare - DateTime.UnixEpoch).TotalMilliseconds; } }