2012-08-17 158 views
5

我有像相對datetime字符串:轉換相對日期時間字符串到DateTime對象

  • 「5分鐘前」
  • 「10個小時前」
  • 「4天前」 等

如何將其轉換爲確切的datetime,正好相反this question

+1

的[聰明的方式來解析日期C#可能的複製](http://stackoverflow.com/questions/14583285/clever-way-to-parse-dates-c-sharp) – 2016-07-03 04:39:19

回答

6

此代碼應工作:

 string input = "10 days ago"; 

     DateTime result = DateTime.MinValue; 
     int minutesMultiplier = 0; 

     if (input.Contains("minute")) 
      minutesMultiplier = 1; 
     else 
      if (input.Contains("hour")) 
       minutesMultiplier = 60; 
      else 
       if (input.Contains("day")) 
        minutesMultiplier = 1440; 
       else 
        throw new Exception("Couldn't parse time format"); 

     string numberStr = input.Split(' ')[0]; 
     int number; 
     if (int.TryParse(numberStr, out number)) 
      result = DateTime.Now.AddMinutes(-number * minutesMultiplier); 

它做的間隔名稱解析(如分鐘,小時,日)和它們相乘得到的分鐘數,因爲後來它使用DateTime.Now.AddMinutes方法,同樣的事情可以使用TimeSpan完成,並調用DateTime.Now.Add

這裏是一個處理包含多個間隔名稱的字符串的情況下,如「10小時15分鐘前」一個例子:

 // If there are mixed interval types in an input string 
     string input = "10 days and 10 hours ago"; 

     // Parse out the intervals and numbers 
     var matches = Regex.Matches(input, 
         @"(?<number>\d+)\s(?<interval>(day)|(minute)|(hour))"); 

     // Convert them to dictionary 
     var dic = matches 
      .Cast<Match>() 
      .ToDictionary(
       key => key.Groups["interval"].Value, 
       o => int.Parse(o.Groups["number"].Value)); 

     // Calculate the total number of minutes for each interval 
     DateTime result = DateTime.MinValue; 
     int totalMinutes = 0; 

     foreach (var keyValue in dic) 
     { 
      if (keyValue.Key.Contains("minute")) 
       totalMinutes += keyValue.Value; 
      else 
       if (keyValue.Key.Contains("hour")) 
        totalMinutes += keyValue.Value * 60; 
       else 
        if (keyValue.Key.Contains("day")) 
         totalMinutes += keyValue.Value * 1440; 
        else 
         throw new Exception("Unparsable time format"); 
     } 

     result = DateTime.Now.AddMinutes(-totalMinutes); 
+1

請注意,此代碼依賴正確格式化的輸入字符串。 – 2012-08-17 09:27:56

+1

是的,推定是輸入是可預測的並可能自動生成。 – 2012-08-17 09:30:55

+1

'string input =「10小時30分鐘前」;' - 你的代碼是做什麼的?我知道你不能預見所有可能的輸入,但是當輸入不符合你期望的格式時,你應該拋出一個異常,而不是默默地做錯誤的事情。 – hvd 2012-08-17 09:48:15

2

正確的方法是將您的相對值存儲爲TimeSpan值,並從DateTime.Now(或您希望用作基準的任何DateTime)中減去該值。

您可以使用諸如int.Parse之類的方法將數字(分鐘數,小時數等)轉換爲整數值並將其複製到您的TimeSpan值中。確切的解析算法取決於您的字符串的實際格式,即允許哪些單詞出現,以及按什麼順序出現這些數字。

如果如你的問題的字符串已經隔離,你可以嘗試使用正則表達式(與Regex class)拆卸他們:

^(\d+)\s+([a-z]+)\s+ago$ 
6

你需要編寫自己的程序這樣做就像做相反的人必須做的一樣。基本上,您將需要解析文本以查找間隔(即分鐘數,小時數,天數等),金額以及它是過去還是未來(使用agofrom)。

此時,您將擁有足夠的數據構建適當的TimeSpan實例,並將其與DateTime.Now一起使用以獲得該時間。

爲了達到上述目的,您需要確保要解析的字符串值是標準化的。

相關問題