【问题标题】:CsvReader DateTimeKind UTCCsvReader DateTimeKind UTC
【发布时间】:2017-01-10 22:53:56
【问题描述】:

CsvReader 序列化程序正在将字符串“2017-01-09T00:01:47.6145940Z”转换为本地时间,但我想保留 UTC 记录。

不传递 Map,有没有办法定义 DateTimeStyle?

这里是转换代码:

using (var reader = new StreamReader(lakeStream))
using (var csv = new CsvReader(reader, new CsvConfiguration()
{
    HasHeaderRecord = hasHeaderRecord,
    Delimiter = delimiter,
    IgnoreBlankLines = true,
    IsHeaderCaseSensitive = false,  

}))
{
    rows = csv.GetRecords<T>().ToList();
}

我尝试了 CultureInfo,但无法正常工作

【问题讨论】:

  • CsvReader 类究竟来自哪里?据我所知,标准框架中没有这样的东西。
  • 您可以将其反序列化为 String 并自行解析。

标签: c# datetime streamreader utc serialization


【解决方案1】:

假设您无法覆盖将 CSV 日期转换为 DateTime 值的代码,您可以在转换后更正它,假设您的行类型 (class) 没有值的不可变属性 (即您可以重新设置值)。

rows = csv.GetRecords<Row>().ToList();

foreach(Row row in rows) {

    row.SomeDateValue = row.SomeDateValue.ToUniversalTime();
}

【讨论】:

  • 同意,但由于 OP 想要 UTC,我认为呼叫应该是 ToUniversalTime() 而不是 ToLocalTime()
【解决方案2】:

默认情况下,解析 DateTime 将始终返回本地时间。您可以选择使用此代码(DateTimeStyles.RoundtripKind 将保留输入字符串中的 DateTime 类型),假设 value 是包含您的日期的字符串:

DateTime parsedDate;
DateTime.TryParseExact(value, "o", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out parsedDate);

或者按照其他答案的建议在解析的对象上使用ToUniversalTime()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-05
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    相关资源
    最近更新 更多