【问题标题】:How to split string of dates and convert into UTC dates using linq如何使用 linq 拆分日期字符串并转换为 UTC 日期
【发布时间】:2016-02-12 16:41:25
【问题描述】:

我有包含日期​​的逗号分隔字符串,并希望将其转换为 UTC。

我写了这段代码:

daterange1.Select(t => t.Split(',').Select(r => r.Replace(r, TimeZoneInfo.ConvertTimeToUtc(DateTime.Parse(r), selectedTimeZone).ToString())));

但它只是转换第一个元素而不是所有元素。

有什么建议吗?

编辑

daterange = "2016-02-15 17:30:00,2016-02-15 18:00:00;2016-02-16 17:30:00,2016-02-16 18:00:00";

var daterange1 = dateRange.Split(';');

daterange1.Select(t => t.Split(',').Select(r => r.Replace(r, TimeZoneInfo.ConvertTimeToUtc(DateTime.Parse(r), selectedTimeZone).ToString())));

每个逗号分隔的字符串包含开始日期和结束日期。

【问题讨论】:

  • 当 LINQ 不合适时的一个很好的例子
  • 在您的问题中显示逗号分隔的字符串并显示所需的结果。
  • 为什么在r 上使用Replace 而不仅仅是解析、转换为utc 和tostring(或者最好将其保留为DateTime)?基本上r.Replace(r, whatever)whatever 相同
  • @TimSchmelter,我知道那个 linq 语句有问题,如果你能纠正它会更好

标签: c# asp.net .net linq


【解决方案1】:

这会做 - 测试

var dates = "2016-02-15 17:30:00,2016-02-15 18:00:00,2016-02-16 17:30:00,2016-02-16 18:00:00";
DateTime[] utcDates = dates.Split(',').Select(d => DateTime.Parse(d)).Select(dt => dt.ToUniversalTime()).ToArray();

foreach (var d in utcDates)
{
       Console.WriteLine(d);
}

@mxmlc 指出我的答案并不完全正确。所以,这是另一个可以肯定回答这个问题的变体。它包含逗号分隔的开始/结束和分号分隔的日期集

var dates = "2016-02-15 17:30:00,2016-02-15 18:00:00;2016-02-16 17:30:00,2016-02-16 18:00:00";

// prepare results
// Legend: se = start/end; sed = stard-end date
var utcDates = dates.Split(';').
               Select(se => se.Split(',')).
               Select(se => new DateTime[]{ 
                                  DateTime.Parse(se[0]).ToUniversalTime(), 
                                  DateTime.Parse(se[1]).ToUniversalTime()});

// print out results                
utcDates.Select(sed => string.Format("Start Date: {0}; End Date: {1}", sed[0], sed[1])).
         ToList().
         ForEach(r => Console.WriteLine(r));

【讨论】:

  • 这不能回答问题。 Anil 说他有一个开始日期和结束日期(逗号分隔开始日期和结束日期,而分号分隔开始日期和结束日期组)并且在您的答案中没有出现分号。
【解决方案2】:

你可以这样做:

string daterange = "2016-02-15 17:30:00,2016-02-15 18:00:00;2016-02-16 17:30:00,2016-02-16 18:00:00";

var result = daterange.Split(';').Select(delegate(string strStartEndDates)
{
    string[] arrStartEndDates = strStartEndDates.Split(',');

    DateTime dtStart = DateTime.Parse(arrStartEndDates[0]);
    DateTime dtEnd = DateTime.Parse(arrStartEndDates[1]);

    /*
        TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
        DateTime timeZoneStartDate = TimeZoneInfo.ConvertTime(dtStart, TimeZoneInfo.Local, tst);
        DateTime timeZoneEndDate = TimeZoneInfo.ConvertTime(dtEnd, TimeZoneInfo.Local, tst);
    */

    return new { Start = dtStart.ToUniversalTime(), End = dtEnd.ToUniversalTime() };

}).ToList<dynamic>();

没有什么特别之处,但如果需要,您可以选择 TimeZone(请参阅注释行)。我使用动态来让我更轻松,但你可以创建一个类。

【讨论】:

    猜你喜欢
    • 2021-04-19
    • 2022-01-11
    • 2016-10-07
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 2022-11-15
    相关资源
    最近更新 更多