c#中“今天”、“昨天”、“8秒前”等的字符串扩展

本文关键字:字符串 扩展 8秒前 昨天 今天 | 更新日期: 2023-09-27 18:07:33

有没有人听说过,或者访问过一些c#字符串扩展片段或库,将"昨天","今天","明天"之类的东西变成日期时间或"8秒前","从现在开始10分钟"变成时间跨度?

如果没有,有什么想法在c#中看起来像什么吗?

谢谢

c#中“今天”、“昨天”、“8秒前”等的字符串扩展

我从某个地方得到了这个

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那么快,性能也不高,但对你来说可能无关紧要,更容易使用,有更多的帮助等等)。参见