我有datetime
像这样的相对字符串:
- “5 分钟前”
- “10 小时前”
- “3 天前”等
我如何将其转换为确切的,与这个问题datetime
完全相反
你需要编写自己的例程来这样做,就像做相反的人必须做的那样。
本质上,您将需要解析文本以查找时间间隔(即分钟、小时、天等...)、数量以及它是过去还是将来(使用ago
或from
)。
此时,您将有足够的数据来构建适当的TimeSpan
实例并使用它DateTime.Now
来获取该时间。
为了上述工作,您需要确保要解析的字符串值是标准化的。
此代码应该可以工作:
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 hours and 15 minutes ago”:
// 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);
正确的方法是将您的相对值存储为一个值并从(或从您想用作基础的任何内容中)TimeSpan
减去该值。DateTime.Now
DateTime
您可以使用诸如int.Parse
将数字(分钟数、小时数等)转换为整数值并将其复制到您的TimeSpan
值中的方法。确切的解析算法取决于字符串的实际格式,即其中允许使用哪些单词,以及数字出现的顺序。
如果字符串已经被隔离,如您的问题所示,您可以尝试使用正则表达式(使用Regex
class)反汇编它们:
^(\d+)\s+([a-z]+)\s+ago$