Как сказать YamlDotNet, что бы он читал дату в русском формате?
Читаю настройки из YAML файла. В настройках присутствует InitialDateTime.
В моем случае она задан как 07.09.2020 9:00:00.
Система вычитывает дату как 9 июля, а мине надо сказать YamlDotNet, что это 7 сентября.
Подскажите как дать понять ей, что дата записана как день.месяц.год.
Program.cs
using System;
namespace YamlDotNet_stackoverflow_Example
{
class Program
{
static void Main(string[] args)
{
var settings = Settings.GetFromYamlFile("Settings.yaml");
settings.SaveToYamlFile("Settings_output.yaml");
Console.WriteLine($"{settings.InitialDateTime:U}");
}
}
}
Settings.cs
using System;
using System.Globalization;
using System.IO;
using YamlDotNet.Serialization;
namespace YamlDotNet_stackoverflow_Example
{
/// <summary>
/// Настройки расчета солвера
/// </summary>
public class Settings
{
/// <summary>
/// Начальная дата-время
/// </summary>
public DateTime InitialDateTime { get; set; }
/// <summary>
/// Чтение настроек из yaml-файла
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static Settings GetFromYamlFile(string fileName)
{
//CreateYamlFile(fileName);
var deserializer = new DeserializerBuilder()
.IgnoreUnmatchedProperties().Build();
using var file = new StreamReader(fileName);
var res = deserializer.Deserialize<Settings>(file);
return res;
}
/// <summary>
/// Сохранение настроек в yaml-файл
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public void SaveToYamlFile(string fileName)
{
var builder = new SerializerBuilder();
builder = builder.EmitDefaults(); // Для принудительной сериализации 0-вых значений
var serializer = builder.Build();
using var file = new StreamWriter(fileName);
serializer.Serialize(file, this);
file.Flush();
}
/// <summary>
/// Генератор для трафарета yaml-файла настроек при изменении структуры класса настроек
/// </summary>
/// <param name="fileName"></param>
private static void CreateYamlFile(string fileName)
{
var builder = new SerializerBuilder();
builder.EmitDefaults(); // Для принудительной сериализации 0 значений
var serializer = builder.Build();
var settings = new Settings
{
InitialDateTime = new DateTime(2020, 9, 7, 9, 0, 0)
};
using var file = new StreamWriter(fileName);
serializer.Serialize(file, settings);
file.Flush();
}
}
}
Settings.yaml
InitialDateTime: 07.09.2020 9:00:00
Пример данных и код: https://github.com/Dejsving/YamlDotNet-stackoverflow-Example
Ответы (1 шт):
Нужно добавить к сериализатору конвертер DateTimeConverter с помощью метода WithTypeConverter.
var converter = new DateTimeConverter(provider: new CultureInfo("ru-RU"));
var deserializer = new DeserializerBuilder()
.IgnoreUnmatchedProperties()
.WithTypeConverter(converter)
.Build();
В конвертере можно задать как провайдер (в примере выше это русскоязычная культура new CultureInfo("ru-RU")), так и формат:
var converter = new DateTimeConverter(formats: "dd.MM.yyyy H:mm:ss");
Форматов можно указать несколько, сработает первый успешный.
Документация Custom date and time format strings.
Можно комбинировать провайдер и форматы.
Дополнительно откройте пространства имён:
using System.Globalization;
using YamlDotNet.Serialization.Converters;
Примечание: метод EmitDefaults является устаревшим. Возможно, вы используете старую версию библиотеки. Советую обновиться.
Мне интеллисенс подсказывает заменить его на ConfigureDefaultValuesHandling:
builder.ConfigureDefaultValuesHandling(DefaultValuesHandling.Preserve);