2

在寻找进行“相对时间”转换的最佳方法时,我遇到了这篇文章

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

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

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

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

这将在 2 个月前输出。

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

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

4

4 回答 4

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。可以这么说,它并没有“过冲”。如果您想要其他规则,您可能会发现您可以在这些规则之上实施它们。

于 2013-05-25T19:32:37.563 回答
1

用于TimeSpan表示DateTime对象的差异。

以您为例,从 3 月 3 日到 5 月 25 日,还没有过去整整 3 个月。直到 6 月 3 日,你才能得到 3 个月。在那之前是 2 个月或 2.x 个月。

于 2013-05-25T13:57:17.427 回答
1

这也是一个定义问题。

例如,对于银行来说,一年只有 360 天。因此,一个月前就像是 30 天前。

此外,如果人们说正好是一个月前,他们的意思是“一个月前,同一天”。在某些情况下,这比 30 天的平均值多(例如 7 月)或更少(例如 2 月)。

那你现在需要什么?由于第二种情况更符合逻辑,你想回到两个月前

在 C# 中,您只需调用 AddMonths-Function (25.05.2013 => 25.03.2013)

DateTime.AddMonths(-2)

编辑: 我将一些日期时间传递给 jeff 的函数:以下是一些结果:

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));

尽管正如我所指出的,这只是定义问题。

于 2013-05-25T14:18:37.423 回答
0

您提到的帖子是关于 jQuery 和 java 的,它们具有不同的计算日期和日期的基础。如果你在 javascript 和 C# 中使用相同的算法,有时你会看到相差 1 的结果。请检查获取 weekday 的 javascript 函数,你知道我的意思。

由于您的帖子带有 C# 标记,因此您实际上是在问 C# .NET 问题。您可以尝试 DateTime.AddMonths(-2) 并检查结果。

于 2013-05-25T14:06:18.453 回答