#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);
}
}