在寻找进行“相对时间”转换的最佳方式时,我遇到了this post
在2013年3月3日(今天是2013年5月25日)的第一次测试中,实际时间在2个月前回归。
这对我来说似乎不对,因为它应该是3.这是一个错误还是有更好的方法进行相对时间转换?
更新:所以我正在使用该代码并创建了一个扩展方法,例如:
DateTime.Parse('2013-03-05T16:12:30Z').ToRelativeTime()
那将在两个月前输出。
用3个月前生成的moment.js做客户端代码。
我想使用任何DateTime,并且能够将ToRelativeTime用于过去的日期
答案 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);
}
}
Noda Time 始终总是有效地截断为零 - 所以如果你要求x和y之间的月份,它将返回最大数字,使得x +表示许多月数小于或等于年。它可以说不会“超调”。如果你想要其他规则,你可能会发现你可以在这些规则之上实现它们。
答案 1 :(得分:1)
使用TimeSpan
表示DateTime
个对象的差异。
对于3月3日至5月25日的例子,整整3个月尚未过去。直到6月3日你才能获得3个月。在那之前它是2个月或2.x个月。
答案 2 :(得分:1)
这也是一个定义问题。
E.g。银行每年只有360天。所以一个月前就像30天前一样。
此外,如果人们说它只是一个月前,它们的意思是“一个月后,同一天”。 在某些情况下,这比平均30天更多(例如7月)或更少(例如2月)。
那你现在需要什么? 由于第二种情况更合乎逻辑,你想要回归两个月
在C#中,您只需调用AddMonths-Function(25.05.2013 => 25.03.2013)
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));
虽然正如我所指出的那样,这只是一个定义问题。
答案 3 :(得分:0)
你提到的帖子是关于jQuery和java的,它们有不同的日期和日期计算基础。如果你在javascript和C#中使用相同的算法,你会看到有时不同的结果1.请检查获取weeekday的javascript函数,你知道我的意思。
由于您的帖子标有C#,您实际上是在询问C#.NET问题。您可以尝试DateTime.AddMonths(-2)并检查结果。