using System.Globalization; using Avalonia.Data.Converters; namespace GSS2.UI.Core.Converters; public class DateTimeConverter : IValueConverter { private static readonly string[][] FORMATS = { ["dd", "d"], ["."], ["MM", "M"], ["."], ["yyyy", "yy"], [" "], ["HH", "H"], [":"], ["mm", "m"], [":"], ["ss", "s"] }; private static readonly string[] ALL_FORMATS = FORMATS .Aggregate(new List { "" }, (acc, segments) => acc.SelectMany(a => segments.Select(s => a + s)).ToList()) .ToArray(); public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { if (value is not DateTime dateTime) return Avalonia.Data.BindingNotification.ExtractError(new FormatException($"Не удаётся распознать значение \"{value}\" как дату и время")); return dateTime.ToLocalTime().ToString("dd.MM.yyyy HH:mm:ss"); } public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) { if (value is not string str) return Avalonia.Data.BindingNotification.ExtractError(new FormatException($"Не удаётся распознать значение \"{value}\" как дату и время")); var success = DateTime.TryParseExact(str, ALL_FORMATS, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out var dateTime); if (!success) return Avalonia.Data.BindingNotification.ExtractError(new FormatException($"Не удаётся распознать строку \"{str}\" как дату и время")); return dateTime.ToUniversalTime(); } }