using System.Globalization; namespace Data_Coupler.Services; /// /// Servizio utility per la gestione di date, orari e formattazione /// Utilizza il formato 24h per coerenza con il sistema /// public static class DateTimeHelper { /// /// Formato orario 24h standard utilizzato in tutto il sistema /// public const string TimeFormat24H = "HH:mm"; /// /// Formato data/ora 24h completo utilizzato per il logging e la visualizzazione /// public const string DateTimeFormat24H = "dd/MM/yyyy HH:mm:ss"; /// /// Formato data/ora 24h per i log dettagliati /// public const string DetailedDateTimeFormat24H = "dd/MM/yyyy HH:mm:ss.fff"; /// /// Cultura italiana per la formattazione (formato 24h di default) /// public static readonly CultureInfo ItalianCulture = new("it-IT"); /// /// Converte un TimeSpan in stringa formato 24h (HH:mm) /// public static string FormatTime24H(TimeSpan time) { return time.ToString(TimeFormat24H); } /// /// Converte un DateTime in stringa formato 24h (dd/MM/yyyy HH:mm:ss) /// public static string FormatDateTime24H(DateTime dateTime) { return dateTime.ToString(DateTimeFormat24H, ItalianCulture); } /// /// Converte un DateTime in stringa formato 24h dettagliato con millisecondi /// public static string FormatDateTimeDetailed24H(DateTime dateTime) { return dateTime.ToString(DetailedDateTimeFormat24H, ItalianCulture); } /// /// Prova a parsare una stringa orario in formato 24h /// public static bool TryParseTime24H(string? timeString, out TimeSpan time) { time = default; if (string.IsNullOrWhiteSpace(timeString)) { return false; } return TimeSpan.TryParseExact(timeString.Trim(), TimeFormat24H, ItalianCulture, out time); } /// /// Prova a parsare una stringa data/ora in formato 24h /// public static bool TryParseDateTime24H(string? dateTimeString, out DateTime dateTime) { dateTime = default; if (string.IsNullOrWhiteSpace(dateTimeString)) { return false; } return DateTime.TryParseExact(dateTimeString.Trim(), DateTimeFormat24H, ItalianCulture, DateTimeStyles.None, out dateTime); } /// /// Ottiene l'ora corrente locale formattata in 24h /// public static string GetCurrentTime24H() { return FormatTime24H(DateTime.Now.TimeOfDay); } /// /// Ottiene la data/ora corrente locale formattata in 24h /// public static string GetCurrentDateTime24H() { return FormatDateTime24H(DateTime.Now); } /// /// Valida se una stringa rappresenta un orario valido nel formato 24h /// public static bool IsValidTime24H(string? timeString) { return TryParseTime24H(timeString, out _); } /// /// Valida se una stringa rappresenta una data/ora valida nel formato 24h /// public static bool IsValidDateTime24H(string? dateTimeString) { return TryParseDateTime24H(dateTimeString, out _); } /// /// Converte un orario dal formato 12h al formato 24h se necessario /// public static string? ConvertTo24H(string? timeString) { if (string.IsNullOrWhiteSpace(timeString)) { return timeString; } // Se è già in formato 24h, restituisci così com'è if (TryParseTime24H(timeString, out var time24)) { return FormatTime24H(time24); } // Prova a parsare dal formato 12h if (DateTime.TryParse(timeString.Trim(), ItalianCulture, DateTimeStyles.None, out var parsed)) { return FormatTime24H(parsed.TimeOfDay); } return null; // Formato non riconosciuto } /// /// Calcola il tempo rimanente fino al prossimo orario schedulato /// public static TimeSpan TimeUntilNextSchedule(TimeSpan scheduledTime, DateTime? referenceTime = null) { var now = referenceTime ?? DateTime.Now; var currentTime = now.TimeOfDay; // Se l'orario programmato è già passato oggi, programma per domani if (currentTime > scheduledTime) { var tomorrow = now.Date.AddDays(1); var nextExecution = tomorrow.Add(scheduledTime); return nextExecution - now; } else { var today = now.Date; var nextExecution = today.Add(scheduledTime); return nextExecution - now; } } /// /// Ottiene il nome del giorno della settimana in italiano /// public static string GetDayOfWeekName(DayOfWeek dayOfWeek) { return dayOfWeek switch { DayOfWeek.Sunday => "Domenica", DayOfWeek.Monday => "Lunedì", DayOfWeek.Tuesday => "Martedì", DayOfWeek.Wednesday => "Mercoledì", DayOfWeek.Thursday => "Giovedì", DayOfWeek.Friday => "Venerdì", DayOfWeek.Saturday => "Sabato", _ => dayOfWeek.ToString() }; } /// /// Ottiene il nome del giorno della settimana in italiano tramite indice (0=Domenica) /// public static string GetDayOfWeekName(int dayOfWeekIndex) { if (dayOfWeekIndex < 0 || dayOfWeekIndex > 6) { return "Non valido"; } return GetDayOfWeekName((DayOfWeek)dayOfWeekIndex); } }