2016-02-12 67 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>(); 

沒什麼特別的吧,但如果需要的話,你可以選擇一個時區(見註釋行)。我使用動態來讓我更容易,但是你可以創建一個類。