5

我有datetime像这样的相对字符串:

  • “5 分钟前”
  • “10 小时前”
  • “3 天前”等

我如何将其转换为确切的,与这个问题datetime完全相反

4

3 回答 3

6

你需要编写自己的例程来这样做,就像做相反的人必须做的那样。

本质上,您将需要解析文本以查找时间间隔(即分钟、小时、天等...)、数量以及它是过去还是将来(使用agofrom)。

此时,您将有足够的数据来构建适当的TimeSpan实例并使用它DateTime.Now来获取该时间。

为了上述工作,您需要确保要解析的字符串值是标准化的。

于 2012-08-17T09:18:31.453 回答
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 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);
于 2012-08-17T09:26:50.447 回答
2

正确的方法是将您的相对值存储为一个值并从(或从您想用作基础的任何内容中)TimeSpan减去该值。DateTime.NowDateTime

您可以使用诸如int.Parse将数字(分钟数、小时数等)转换为整数值并将其复制到您的TimeSpan值中的方法。确切的解析算法取决于字符串的实际格式,即其中允许使用哪些单词,以及数字出现的顺序。

如果字符串已经被隔离,如您的问题所示,您可以尝试使用正则表达式(使用Regexclass)反汇编它们:

^(\d+)\s+([a-z]+)\s+ago$
于 2012-08-17T09:17:41.173 回答