我有像相對datetime
字符串:轉換相對日期時間字符串到DateTime對象
- 「5分鐘前」
- 「10個小時前」
- 「4天前」 等
如何將其轉換爲確切的datetime
,正好相反this question
我有像相對datetime
字符串:轉換相對日期時間字符串到DateTime對象
如何將其轉換爲確切的datetime
,正好相反this question
此代碼應工作:
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);
請注意,此代碼依賴正確格式化的輸入字符串。 – 2012-08-17 09:27:56
是的,推定是輸入是可預測的並可能自動生成。 – 2012-08-17 09:30:55
'string input =「10小時30分鐘前」;' - 你的代碼是做什麼的?我知道你不能預見所有可能的輸入,但是當輸入不符合你期望的格式時,你應該拋出一個異常,而不是默默地做錯誤的事情。 – hvd 2012-08-17 09:48:15
正確的方法是將您的相對值存儲爲TimeSpan
值,並從DateTime.Now
(或您希望用作基準的任何DateTime
)中減去該值。
您可以使用諸如int.Parse
之類的方法將數字(分鐘數,小時數等)轉換爲整數值並將其複製到您的TimeSpan
值中。確切的解析算法取決於您的字符串的實際格式,即允許哪些單詞出現,以及按什麼順序出現這些數字。
如果如你的問題的字符串已經隔離,你可以嘗試使用正則表達式(與Regex
class)拆卸他們:
^(\d+)\s+([a-z]+)\s+ago$
你需要編寫自己的程序這樣做就像做相反的人必須做的一樣。基本上,您將需要解析文本以查找間隔(即分鐘數,小時數,天數等),金額以及它是過去還是未來(使用ago
或from
)。
此時,您將擁有足夠的數據構建適當的TimeSpan
實例,並將其與DateTime.Now
一起使用以獲得該時間。
爲了達到上述目的,您需要確保要解析的字符串值是標準化的。
的[聰明的方式來解析日期C#可能的複製](http://stackoverflow.com/questions/14583285/clever-way-to-parse-dates-c-sharp) – 2016-07-03 04:39:19