【问题标题】:Converting list of date-time strings to list of DateTime values将日期时间字符串列表转换为日期时间值列表
【发布时间】:2016-10-27 16:45:08
【问题描述】:

我是 C# 的新手。使用 SharpDevelop 程序。我可以在“for”循环中转换 ISO 8601 DateTime 值。我确信“记录”的 ToList 方法将允许我将所有字符串条目转换为 DateTime 值,但我无法到达那里。请帮忙。

var myFormat = string.Empty;
myFormat = "yyyy-MM-ddTHH:mm:ss";
var myDateTime = System.DateTime.Now;
var originTime = new System.DateTime(1970,1,1,0,0,0);
var mySpan = myDateTime.Subtract(new System.DateTime(1970,1,1,0,0,0));
var value = mySpan.TotalSeconds;

using (var sr = new StreamReader(@"C:\Users\me\Desktop\file.csv"))
{
    var reader = new CsvReader(sr);
    IEnumerable<DataRecord1> records = reader.GetRecords<DataRecord1>();
    foreach (DataRecord1 record in records.Take(5)) 
    {
        myDateTime = System.DateTime.ParseExact( record.TimeWhen, myFormat, null );
        mySpan = myDateTime.Subtract( originTime );
        value = mySpan.TotalSeconds;
        seconds = ( float ) myDateTime;
        Debug.Print("{0}", value );
    }
}

【问题讨论】:

  • 你能更好地解释你的问题吗?你的foreach 声明应该做什么?
  • 当然。我正在使用 for 循环和字符串到 DateTime 转换(读取 ISO 8601 时间字符串的向量)来学习 C#。那是发布的代码。只想知道如何使用 records.ToList 来处理所有的字符串条目,每个条目都有它的 DateTime 值。
  • 您所做的不仅仅是将文本转换为日期,但我不确定是什么或为什么或问题是什么。
  • “我确信 'records' 的 ToList 方法允许我将所有字符串条目转换为 DateTime 值,但我无法到达那里。” ——“我不能到达那里”不是一个问题。请告诉我们您遇到了什么问题,或者至少提出一个问题。这是一个问答网站,您没有提出任何问题。从答案来看,人们能够提取您的实际问题:“如何创建我解析的 DateTime 的列表?我想我可以以某种方式使用ToList(),但我不知道在哪里”——直接问,我们可以更好地帮助您,而不是破译意图。

标签: c# linq datetime iso8601


【解决方案1】:

要从某种A 类型的列表转换为B 类型的列表,我建议你使用Linq Select() 方法

using system.Linq;

IEnumerable<DataRecord1> records = reader.GetRecords<DataRecord1>();
List<DateTime> datetimes = records.Select(x => System.DateTime.ParseExact(x.TimeWhen, myFormat, null).ToList();

【讨论】:

  • 我相信您在 null 之后缺少括号“)”。
【解决方案2】:

您可以使用 LINQ 来做到这一点

var l = records
    .Select(x=>System.DateTime.ParseExact(x.TimeWhen, myFormat, null))
    .Select(x=>x.Subtract(originTime))
    .Select(x=>mySpan.TotalSeconds)
    .ToList();

【讨论】:

    【解决方案3】:

    除了使用 linq,您还可以使用扩展方法来做到这一点:

    public static DateTime ToDateTime(this DataRecord1, format)
    {
        return System.DateTime.ParseExact(DataRecord1.TimeWhen, format);
    }
    

    和他们,调用 ToDateTime 方法:

    IEnumerable<DataRecord1> records = reader.GetRecords<DataRecord1>();
    List<DateTime> datetimes = new List<DateTime>();
    records.ForEach(x => datetimes.Add(x.ToDateTime());
    

    【讨论】:

      【解决方案4】:

      您的 CsvReader 从签名返回一个 IEnumerable。是否将其转换为列表取决于您。对于 DateTime 转换,我会使用 TryParse。即:

      var originTime = new System.DateTime(1970, 1, 1);
      IEnumerable<DataRecord1> records;
      
      using (var sr = new StreamReader(@"C:\Users\me\Desktop\file.csv"))
      {
          var reader = new CsvReader(sr);
          records = reader.GetRecords<DataRecord1>();
      }
      
      DateTime t;
      var result = from r in records
                   let sWhen = r.TimeWhen
                   let When = DateTime.TryParse(sWhen, out t) ? t : (DateTime?)null
                   let span = When - originTime
                   let Epoch = span.HasValue ? span.Value.TotalSeconds : (double?)null
                   select new
                   {
                       sWhen,
                       When,
                       Epoch
                   };
      
      // result.Take(5).ToList()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-25
        • 2017-05-14
        • 2015-09-17
        • 2022-09-23
        • 2019-08-20
        • 1970-01-01
        • 2020-12-07
        • 1970-01-01
        相关资源
        最近更新 更多