Как перевести дату и время из определенного часового пояса в UTC?

#csvhelper

#csvhelper

Вопрос:

Я хочу принять определенный часовой пояс (EST) при чтении даты и времени и преобразовать в UTC.

Я попробовал это:

 csvPropertyMap.TypeConverterOption(DateTimeStyles.AssumeLocal | DateTimeStyles.AdjustToUniversal);
 

Но это не сработает, так как мой код выполняется в облаке, где локальным является UTC.

Есть ли способ настроить TimeZoneInfo в сопоставлении столбцов?

Ответ №1:

Это должно сработать, если вы хотите предположить DateTime , что значения находятся в определенном часовом поясе, а затем преобразовать их в UTC.

 static void Main(string[] args)
{
    using (MemoryStream stream = new MemoryStream())
    using (StreamWriter writer = new StreamWriter(stream))
    using (StreamReader reader = new StreamReader(stream))
    using (CsvReader csv = new CsvReader(reader))
    {
        writer.WriteLine("Id,Name,FooDate");
        writer.WriteLine("1,Test,04/19/2019 05:42:00");
        writer.Flush();
        stream.Position = 0;

        var easternStandardTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
        csv.Configuration.TypeConverterCache.RemoveConverter<DateTime>();
        csv.Configuration.TypeConverterCache.AddConverter<DateTime>(new TimeZonetoUtcConverter(easternStandardTimeZone));

        var records = csv.GetRecords<Foo>().ToList();

        Console.ReadKey();
    }

}

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime FooDate { get; set; }
}

public class TimeZonetoUtcConverter: DateTimeConverter
{
    private readonly TimeZoneInfo timeZoneInfo;

    public TimeZonetoUtcConverter(TimeZoneInfo timeZoneInfo)
    {
        this.timeZoneInfo = timeZoneInfo;
    }

    public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
    {
        var parsedDate = base.ConvertFromString(text, row, memberMapData);

        return TimeZoneInfo.ConvertTimeToUtc((DateTime)parsedDate, timeZoneInfo);
    }
}