2017-01-10 11 views
0

CsvReaderシリアライザは、文字列 "2017-01-09T00:01:47.6145940Z"を現地時間に変換していますが、UTCでレコードを保持したいと思います。CsvReader DateTimeKind UTC

マップを渡すことなく、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を試みたが、それはあなたがDateTime値にCSV日付を変換するコードを上書きすることはできませんと仮定

+3

正確に 'CsvReader'クラスはどこから来ますか?私が知る限り、標準的なフレームワークにはそれほど何もありません。 – vesan

+0

これを 'String'に逆シリアル化して自分で解析することができます。 – Dai

答えて

0

デフォルトでは、DateTimeの解析では常にローカル時間が返されます。あなたはこのコードを使用するオプションを持っている、(DateTimeStyles.RoundtripKindは、入力文字列からDateTimeの種類が保持されます)、valueがあなたの日付を含む文字列であると仮定すると、次のいずれか

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

またはその他の回答として解析対象物の上にToUniversalTime()を使用します示唆している。

1

を動作するように作ることができませんでした、行のタイプ(class)に値の不変プロパティがない(つまり、値を再設定できる)と仮定して、変換後に修正することができます。

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

foreach(Row row in rows) { 

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

合意しましたが、OPはUTCを望んでいるので、ToLocalTime()の代わりにToUniversalTime()を呼び出す必要があります。 – vesan

+0

@vesan申し訳ありません、脳のおなら!私は今それを修正しました。 – Dai