Files

48 lines
1.7 KiB
C#

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<string> { "" }, (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();
}
}