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