有没有人听说过或访问过一些 c# 字符串扩展片段或库,可以将“昨天”、“今天”、“明天”等内容转换为 DateTimes 或“8 秒前”、“10 分钟后”进入时间跨度?
如果没有,对 C# 中的样子有什么想法吗?
谢谢
有没有人听说过或访问过一些 c# 字符串扩展片段或库,可以将“昨天”、“今天”、“明天”等内容转换为 DateTimes 或“8 秒前”、“10 分钟后”进入时间跨度?
如果没有,对 C# 中的样子有什么想法吗?
谢谢
我在某个时候从某个地方得到了这个。
public static string ElapsedTime(DateTime dtEvent)
{
TimeSpan TS = DateTime.Now - dtEvent;
int intYears = DateTime.Now.Year - dtEvent.Year;
int intMonths = DateTime.Now.Month - dtEvent.Month;
int intDays = DateTime.Now.Day - dtEvent.Day;
int intHours = DateTime.Now.Hour - dtEvent.Hour;
int intMinutes = DateTime.Now.Minute - dtEvent.Minute;
int intSeconds = DateTime.Now.Second - dtEvent.Second;
if (intYears > 0) return String.Format("{0} {1} ago", intYears, (intYears == 1) ? "year" : "years");
else if (intMonths > 0) return String.Format("{0} {1} ago", intMonths, (intMonths == 1) ? "month" : "months");
else if (intDays > 0) return String.Format("{0} {1} ago", intDays, (intDays == 1) ? "day" : "days");
else if (intHours > 0) return String.Format("{0} {1} ago", intHours, (intHours == 1) ? "hour" : "hours");
else if (intMinutes > 0) return String.Format("{0} {1} ago", intMinutes, (intMinutes == 1) ? "minute" : "minutes");
else if (intSeconds > 0) return String.Format("{0} {1} ago", intSeconds, (intSeconds == 1) ? "second" : "seconds");
else
{
return String.Format("{0} {1} ago", dtEvent.ToShortDateString(), dtEvent.ToShortTimeString());
}
}
我不知道任何开箱即用的库,但它很容易编写你自己的:
public static class DateTimeExtensions
{
public static DateTime Yesterday (this DateTime x)
{
return x.AddDays(-1);
}
}
然后,您可以执行以下操作:
var yesterday = DateTime.Now.Yesterday();
编辑:您似乎只想将逐字字符串转换为日期时间。如果不将某些字符串显式映射到某个条件,我看不出你怎么能做到这一点,例如
public static DateTime GiveMeADateTime(this string stringValue)
{
switch (stringValue)
{
case "today": return DateTime.Now;
case "tomorrow": return DateTime.Now.AddDays(1);
default: return DateTime.Now;
}
}
然后你可以像这样使用它:
var todaysDate = "today".GiveMeADateTime();
请注意,这不是动态的,也不是可维护的。但我想这可能会给你一些想法。
既然这将成为关于这个主题的公开辩论......
对于 C# 或其他方式,我还没有看到任何类似的东西,所以:
你需要一个解析器,显然......
1)自己制作一个“方便”的解析器 - 取决于您在这里定位的“语言”,如果它足够简单,您可以使用简单的“标记化”,只需过滤“已知单词”(例如,不要介意词汇分析等,允许“奇怪”的词),把它们放在篮子里并提取数字。匹配秒等、数量和一些短语。这并不理想,远非如此,但如果简单,如果它有效,那就太好了。
2) RegEx 对于AST类型的问题并不理想——但同样,如果您将问题最小化,您可以解析出其中的一些问题。就个人而言,我不会,但是如果您需要一种快速而肮脏的语言并且没有真正的语言,只需解析出简单的格式,请尝试一下
3)对于更复杂 - 和更好的解决方案 - 使用像Antlr这样具有 C# 库的一流解析器(虽然帮助很少 - 但如果需要,提出一个更具体的问题,我会尝试挖掘一些代码)。
还有Irony,它是一个基于表达式的 C# 原生解析器 - 使用起来很有趣(虽然不如 Antlr 快或性能好,但它对你来说可能无关紧要,更容易使用,更多帮助等)。也可以看看