DateTime相对转换问题

时间:2013-05-25 13:50:30

标签: c# .net datetime

在寻找进行“相对时间”转换的最佳方式时,我遇到了this post

在2013年3月3日(今天是2013年5月25日)的第一次测试中,实际时间在2个月前回归。

这对我来说似乎不对,因为它应该是3.这是一个错误还是有更好的方法进行相对时间转换?

更新:所以我正在使用该代码并创建了一个扩展方法,例如:

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

那将在两个月前输出。

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

我想使用任何DateTime,并且能够将ToRelativeTime用于过去的日期

4 个答案:

答案 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)并检查结果。