Convert relative datetime string into DateTime object
我有相对的
- "5分钟前"
- "10小时前"
- "3天前"等
如何将其转换为精确的
这段代码应该有效:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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); |
它解析间隔名称(例如分钟,小时,天)并将它们相乘以获得分钟数,因为稍后它使用
这是另一个处理包含多个间隔名称的字符串大小写的示例,例如"10小时15分钟前":
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | // 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 | ^(\d+)\s+([a-z]+)\s+ago$ |