c#中“今天”、“昨天”、“8秒前”等的字符串扩展
本文关键字:字符串 扩展 8秒前 昨天 今天 | 更新日期: 2023-09-27 18:07:33
有没有人听说过,或者访问过一些c#字符串扩展片段或库,将"昨天","今天","明天"之类的东西变成日期时间或"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那么快,性能也不高,但对你来说可能无关紧要,更容易使用,有更多的帮助等等)。参见