Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将相对datetime字符串转换为datetime对象_C#_Datetime_Datetime Format - Fatal编程技术网

C# 将相对datetime字符串转换为datetime对象

C# 将相对datetime字符串转换为datetime对象,c#,datetime,datetime-format,C#,Datetime,Datetime Format,我有相对datetime字符串,如: “5分钟前” “10小时前” “3天前”等 如何将其转换为精确的日期时间,与之正好相反正确的方法是将您的相对值存储为一个值,然后从日期时间中减去该值。现在(或者从您想要用作基础的任何日期时间中) 您可以使用以下方法将数字(分钟数、小时数等)转换为整数值,并将其复制到您的TimeSpan值中。确切的解析算法取决于字符串的实际格式,即允许哪些单词在其中,以及数字的显示顺序 如果字符串已被隔离(如问题中所示),则可以尝试使用正则表达式(使用): 你需要编写自己

我有相对
datetime
字符串,如:

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

如何将其转换为精确的
日期时间
,与之正好相反正确的方法是将您的相对值存储为一个值,然后从
日期时间中减去该值。现在
(或者从您想要用作基础的任何
日期时间中)

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

如果字符串已被隔离(如问题中所示),则可以尝试使用正则表达式(使用):


你需要编写自己的例程来完成这一任务,就像人们不得不做相反的事情一样

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

此时,您将有足够的数据来构造一个适当的
TimeSpan
实例,并将其与
DateTime一起使用。现在
来获取该时间

为了实现上述功能,您需要确保要分析的字符串值是标准化的。

此代码应该可以:

        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分钟前”:

//如果输入字符串中存在混合的间隔类型
字符串输入=“10天10小时前”;
//解析出间隔和数字
var matches=Regex.matches(输入,
@“(?\d+)\s(?(天)(分钟)(小时))”;
//把它们转换成字典
var dic=匹配项
.Cast()
.ToDictionary(
key=>key.Groups[“interval”].Value,
o=>int.Parse(o.Groups[“number”].Value));
//计算每个间隔的总分钟数
DateTime结果=DateTime.MinValue;
int totalMinutes=0;
foreach(dic中的var键值)
{
if(keyValue.Key.Contains(“分钟”))
totalMinutes+=keyValue.Value;
其他的
if(keyValue.Key.Contains(“小时”))
totalMinutes+=keyValue.Value*60;
其他的
if(keyValue.Key.Contains(“日”))
totalMinutes+=keyValue.Value*1440;
其他的
抛出新异常(“不可解析的时间格式”);
}
结果=DateTime.Now.AddMinutes(-totalMinutes);

请注意,此代码依赖于格式正确的输入字符串。是的,假设输入是可预测的,并且可能自动生成。
string input=“10小时30分钟前”--您的代码做什么?我知道你不能预见所有可能的输入,但是当输入的格式不是你期望的格式时,你应该抛出一个异常,而不是默默地做错误的事情。我假设在一个字符串中只能提到一个间隔,因为OP从来没有说过可以有多个间隔。我添加了抛出异常,尽管很明显这不会处理字符串中间隔超过一个的情况。如果可以有多个,则必须以不同的方式进行解析。输入不会引发异常,因为
input.Contains(“minute”)
为true,因此它减去10分钟。根据问题中的输入,我可能会将
input.Split(“”)
存储在一个变量中,检查它的长度是否正好是3,并检查
words[1]
是否正好是“分钟”(或“小时”、“天”,无论您想添加什么),以及
words[2]
是否正好是“以前”。可能的
        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);
        // 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);