关于c#:将相对日期时间字符串转换为DateTime对象

Convert relative datetime string into DateTime object

我有相对的datetime字符串,如:

  • "5分钟前"
  • "10小时前"
  • "3天前"等

如何将其转换为精确的datetime,与此问题完全相反


这段代码应该有效:

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);

它解析间隔名称(例如分钟,小时,天)并将它们相乘以获得分钟数,因为稍后它使用DateTime.Now.AddMinutes方法,同样的事情可以使用TimeSpan并调用DateTime.Now.Add

这是另一个处理包含多个间隔名称的字符串大小写的示例,例如"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);


你需要编写自己的例程才能这样做,就像做反对者的人一样。

基本上,您需要解析文本以查找间隔(即分钟,小时,天等等),数量以及是否在过去或将来(使用agofrom)。

此时,您将拥有足够的数据来构造适当的TimeSpan实例,并将其与DateTime.Now一起使用以获得该时间。

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


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

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

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

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