2013-05-25 67 views
2

虽然寻找做一个“相对时间”转换我碰到this post日期时间相对转换问题

来到我的第一次测试与2013年3月3日期的最佳方法(今天是2013年5月25日)的realitve时间两个月前回来了。

这似乎不适合我,因为它应该是3.这是一个错误还是有更好的方式来做相对时间转换吗?

更新:所以我使用的代码和创建例如扩展方法:

DateTime.Parse('2013-03-05T16:12:30Z').ToRelativeTime() 

这将输出2个月前。

在3个月前产生的moment.js做客户端代码。

我想使用的任何日期时间,并能够使用ToRelativeTime为过去的日期

+0

我会说这是一个错误。你能附上你的代码吗? –

+0

你是否理解那篇文章中的代码?在3月3日到5月25日之间有83天,并且规定一个月为30天; '地板(83/30)= 2'。为什么“应该是3”? –

+0

三个月前是二月份,而不是三月份。也许你更喜欢四舍五入,但没有说明,可能不太合适。 –

回答

2

这似乎没有我的权利,因为它应该是3

为什么? 3月3日肯定不到三个月前,尽管肯定接近三个月。你需要制定出,正好你想要什么规则。我的Noda Time项目可能对你有用。例如:

using System; 
using NodaTime; 

class Test 
{ 
    static void Main() 
    { 
     LocalDate start = new LocalDate(2013, 3, 3); 
     LocalDate end = new LocalDate(2013, 5, 25); 

     // Defaults to years, months and days - but you can change 
     // that by specifying a PeriodUnits value. 
     Period period = Period.Between(start, end); 
     Console.WriteLine("{0} years, {1} months, {2} days", 
          period.Years, period.Months, period.Days); 
    } 
} 

野田佳彦时间总是截断向零,有效的 - 所以,如果你问的X和Y之间的几个月里,它将返回数量最多,使得x +,在数月不太塔或等于y。可以这么说,它不会“超调”。如果你想要其他规则,你可能会发现你可以在它们之上实现它们。

1

使用TimeSpan来表示DateTime对象的差异。

对于3月3日至5月25日的例子,整整3个月还没有通过。直到6月3日,你会得到3个月。在那之前它是2个月或2个月。

0

你提到的帖子是关于jQuery和java的计算日期和日期有不同的基础。如果您在JavaScript和C#中使用相同的算法,您将会看到有时会出现不同的结果1.请检查获取周六日的JavaScript函数,您知道我的意思。

由于您的文章标签为C#,您实际上正在问C#.NET问题。您可以尝试DateTime.AddMonths(-2)并检查结果。

+1

它被标记为c# – Jon

+0

是的,这个问题和参考被标记为C#,但与JavaScript内容。那我认为是javascript的moment.js源码怎么样? – ZZZ

+0

C#和JavaScript有不同的计算日期和日期的想法。所以有时候人们会感到困惑。而且你很多不只是复制C#和JavaScript之间的算法。 – ZZZ

1

这也是一个定义问题。

E.g.对于银行来说,每年只有360天。所以一个月前就像30天后。另外,如果人们说它恰好是一个月前,他们的意思是“一个月前,当天”。 在某些情况下,比平均30天更多(例如7月)或更少(例如2月)。

那么你现在需要什么? 由于第二种情况是更合乎逻辑的,你想要去退后两个月,回到

在C#中,你只需要调用AddMonths-功能(2013年5月25日=> 2013年3月25日)

DateTime.AddMonths(-2) 

编辑: 我通过一些日期时间到杰夫的功能: 这里有一些结果:

DateTime.AddMonths(-2) => Returns two months ago. 
DateTime.AddMonths(-2).AddDays(1) => Returns one month ago. 
DateTime.AddMonths(-3) => Returns two months ago (!) 

这是因为它以30天为一个基地:

int months = Convert.ToInt32(Math.Floor((double)ts.Days/30)); 

虽然正如我指出的那样,这只是一个定义问题。