2009-12-26 78 views
9

大家可能已经注意到,某些web应用程序(例如,GMail的某些部分)的比单纯DD/MM/YYYY更人类可读的格式显示日期。人类可读的日期格式

例如,如果我从23日(恰好是5天前在写作的时候打开一个邮件项目,我会得到如下:

12月23日(3天前)

我想实现我自己的Web应用程序类似的逻辑来此。

例如,使用.NET TimeSpan对象打交道时,我想将它转化成如文本如下:

2个月

3天

是否有一个.NET库已经能够这样做的?

如果不是我可能会建立一些基本的和开源它。


我在这里做了一个基本的启动:

public static class TimeSpanHelpers 
{ 
    public static string ToHumanReadableString(
     this TimeSpan timeSpan) 
    { 
     if (timeSpan.TotalDays > 30) 
      return (timeSpan.TotalDays/30) + " month(s)"; 

     if (timeSpan.TotalDays > 7) 
      return (timeSpan.TotalDays/7) + " week(s)"; 

     return (timeSpan.TotalDays) + " day(s)"; 
    } 
} 
+3

请参阅:http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time – CMS 2009-12-26 07:21:37

+0

真棒...我知道有人会问这个,但无法弄清楚什么条件类型进入搜索框。 – Jonathan 2009-12-26 07:38:23

+0

我在我的博客上有一个简单的算法,可以扩展:http://www.robfe.com/2009/09/timeago-for-csharp/与您的恐怕不是很不一样,恐怕... – 2009-12-26 07:27:04

回答

7

Noda Time组是在做眼前这个过程。来吧,加入乐趣。忘了提项目所在地Noda Time项目

+0

很酷的东西!我会到那边去的。 – Jonathan 2009-12-26 07:39:05

+1

看起来很酷。你能否告诉我们在节点时间项目中我们应该看看的地方。 – heneryville 2013-05-17 13:58:48

1

另一个库这样做的:http://relativetime.codeplex.com/

(适用于的NuGet)

+0

它工作正常,但似乎无法做到未来的日期(例如,我希望它说“在2天内”) – 2016-03-03 23:23:30

10

尝试Humanizer http://humanizr.net/

TimeSpan.FromMilliseconds(1299630020).Humanize(3) => "2 weeks, 1 day, 1 hour" 

// in de-DE culture 
TimeSpan.FromDays(1).Humanize() => "Ein Tag" 
TimeSpan.FromDays(2).Humanize() => "2 Tage" 

// in sk-SK culture 
TimeSpan.FromMilliseconds(1).Humanize() => "1 milisekunda" 

// and a lot more 
DateTime.UtcNow.AddHours(2).Humanize() => "2 hours from now" 
"case".ToQuantity(5) => "5 cases" 
"man".ToQuantity(2) => "2 men" 
122.ToWords() => "one hundred and twenty-two" 
(.5).Gigabytes().Humanize() => "512 MB" 
"Long text to truncate".Truncate(10) => "Long text…", 
"Sentence casing".Transform(To.TitleCase) => "Sentence Casing" 

的NuGet:

Install-Package Humanizer 
0

我最终使用this method,因为我需要支持未来的日期,比如3天后。