2016-02-12 69 views
0

我有逗号分隔的字符串包含日期并希望将其转换为UTC。如何拆分日期字符串并使用linq转换为UTC日期

我写了这个代码:

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

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

有什么建议吗?

EDIT

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()))); 

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

+14

LINQ不合适的一个很好的例子 –

+4

在你的问题中显示逗号分隔的字符串,并显示所需的结果。 – Equalsk

+1

为什么在'r'上替换'而不是仅仅解析,转换为utc和tostring(或者更好地保存为'DateTime')?基本上'r.Replace(r,无论)“与”无论“是一样的 – juharr

回答

5

这将做到这一点 - 测试

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)); 
+0

这并不回答这个问题。 Anil说他有一个开始日期和结束日期(逗号分隔开始日期和结束日期,而分号分隔开始日期和结束日期组),并且在你的回答中没有分号出现。 – mxmlc

+1

@mxmlc更新了答案 –

1

你可以这样做:

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>(); 

没什么特别的吧,但如果需要的话,你可以选择一个时区(见注释行)。我使用动态来让我更容易,但是你可以创建一个类。