3

有没有人听说过或访问过一些 c# 字符串扩展片段或库,可以将“昨天”、“今天”、“明天”等内容转换为 DateTimes 或“8 秒前”、“10 分钟后”进入时间跨度?

如果没有,对 C# 中的样子有什么想法吗?

谢谢

4

3 回答 3

9

我在某个时候从某个地方得到了这个。

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()); 
    } 
} 
于 2013-04-05T22:14:30.450 回答
5

我不知道任何开箱即用的库,但它很容易编写你自己的:

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

请注意,这不是动态的,也不是可维护的。但我想这可能会给你一些想法。

于 2013-04-05T22:13:55.940 回答
2

既然这将成为关于这个主题的公开辩论......

对于 C# 或其他方式,我还没有看到任何类似的东西,所以:

你需要一个解析器,显然......

1)自己制作一个“方便”的解析器 - 取决于您在这里定位的“语言”,如果它足够简单,您可以使用简单的“标记化”,只需过滤“已知单词”(例如,不要介意词汇分析等,允许“奇怪”的词),把它们放在篮子里并提取数字。匹配秒等、数量和一些短语。这并不理想,远非如此,但如果简单,如果它有效,那就太好了。

2) RegEx 对于AST类型的问题并不理想——但同样,如果您将问题最小化,您可以解析出其中的一些问题。就个人而言,我不会,但是如果您需要一种快速而肮脏的语言并且没有真正的语言,只需解析出简单的格式,请尝试一下

3)对于更复杂 - 和更好的解决方案 - 使用像Antlr这样具有 C# 库的一流解析器(虽然帮助很少 - 但如果需要,提出一个更具体的问题,我会尝试挖掘一些代码)。
还有Irony,它是一个基于表达式的 C# 原生解析器 - 使用起来很有趣(虽然不如 Antlr 快或性能好,但它对你来说可能无关紧要,更容易使用,更多帮助等)。也可以看看

于 2013-04-05T23:37:43.443 回答