C#中“今天”,“昨天”,“8秒前”等字符串扩展名等

时间:2013-04-05 22:09:58

标签: c#

有没有人听说过,或者有权访问某些c#字符串扩展片段或库,将“昨天”,“今天”,“明天”等内容转换为DateTimes或“8秒前”,“10分钟”从现在开始“进入TimeSpans?

如果没有,对C#中的内容有什么看法?

由于

3 个答案:

答案 0 :(得分: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()); 
    } 
} 

答案 1 :(得分: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();

请注意,此不是非常动态,也不可维护。但我想这应该可以给你一些想法。

答案 2 :(得分:2)

因为这是关于这个问题的公开辩论......

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

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

1)自己制作一个“方便”的解析器 - 取决于你在这里瞄准的'语言',如果它足够简单你可以通过简单的'标记化',只过滤'已知的单词'(例如不要记住词汇分析等,允许“奇怪”的话,把它们放在篮子里并提取数字。匹配秒数等,数量和一些短语。它不是理想的,远非它,但如果简单,它是好的,如果它的工作。

2)RegEx不适合AST类型的问题 - 但同样,如果你最小化问题,你可以解析一些问题。就个人而言,我不会,但如果你需要一个快速而又脏的,没有真正的语言,只需解析出简单的格式,试试吧

3)对于更复杂的 - 更好的解决方案 - 请使用像Antlr这样的一级解析器,它具有C#的库(虽然帮助很小 - 但如果需要,请提出更具体的问题,我我会尝试挖掘一些代码 还有Irony这是一个基于表达式的C#本机解析器 - 并且很有趣(尽管不像Antlr那么快或高性能,对你来说可能无关紧要,更容易使用,更多帮助等等)。 )。 See also