forked from amkovkov/GranuSightSoftware2
48 lines
1.7 KiB
C#
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();
|
|
}
|
|
}
|