C# 日期时间相对转换问题

C# 日期时间相对转换问题,c#,.net,datetime,C#,.net,Datetime,在寻找进行“相对时间”转换的最佳方法时,我遇到了 在我2013年3月3日(今天是2013年5月25日)的第一次测试中,真实时间回到了2个月前 这对我来说似乎不对,因为它应该是3。这是一个bug还是有更好的方法来进行相对时间转换 更新:因此我使用了该代码并创建了一个扩展方法,例如: DateTime.Parse('2013-03-05T16:12:30Z').ToRelativeTime() using System; using NodaTime; class Test { stat

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

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

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

更新:因此我使用了该代码并创建了一个扩展方法,例如:

DateTime.Parse('2013-03-05T16:12:30Z').ToRelativeTime()
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);
    }
}
这将在2个月前产出

使用3个月前生成的moment.js编写客户端代码


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

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


以3月3日至5月25日为例,整整3个月尚未过去。直到6月3日你才有3个月的假期。在此之前是2个月或2.x个月。

使用
TimeSpan
表示
DateTime
对象之间的差异


以3月3日至5月25日为例,整整3个月尚未过去。直到6月3日你才有3个月的假期。在那之前是2个月或2.x个月。

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


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

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


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

这也是定义问题。

例如,对于银行来说,每年只有360天。所以一个月前就像30天前一样

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

那你现在需要什么? 因为第二种情况更符合逻辑,所以您需要追溯到两个月前

在C#中,只需调用AddMonths函数(25.05.2013=>25.03.2013)

编辑: 我向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));

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

这也是一个定义的问题。

例如,对于银行来说,每年只有360天。所以一个月前就像30天前一样

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

那你现在需要什么? 因为第二种情况更符合逻辑,所以您需要追溯到两个月前

在C#中,只需调用AddMonths函数(25.05.2013=>25.03.2013)

编辑: 我向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));
虽然正如我指出的,这只是一个定义问题

这对我来说似乎不对,因为它应该是3

为什么??3月3日肯定是不到三个月前。。。尽管无可否认,这比两个更接近三个。你需要制定出你想要的规则

我的项目在这里可能对你有用。例如:

DateTime.Parse('2013-03-05T16:12:30Z').ToRelativeTime()
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+多个月小于或等于y。可以说,这并没有“过度”。如果您想要其他规则,您可能会发现您可以在这些规则之上实现它们

这对我来说似乎不对,因为它应该是3

为什么??3月3日肯定是不到三个月前。。。尽管无可否认,这比两个更接近三个。你需要制定出你想要的规则

我的项目在这里可能对你有用。例如:

DateTime.Parse('2013-03-05T16:12:30Z').ToRelativeTime()
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+多个月小于或等于y。可以说,这并没有“过度”。如果您需要其他规则,您可能会发现您可以在这些规则之上实现它们。

我认为这是一个bug。你能附上你的密码吗?你明白那篇文章里的密码吗?3月3日至5月25日之间有83天,该准则将一个月定为30天<代码>楼层(83/30)=2。为什么“应该是3号”?三个月前是二月,不是三月。也许你更喜欢四舍五入,但这是没有说明的,可能不太合适。我会说这是一个错误。你能附上你的密码吗?你明白那篇文章里的密码吗?3月3日至5月25日之间有83天,该准则将一个月定为30天<代码>楼层(83/30)=2。为什么“应该是3号”?三个月前是二月,不是三月。也许你更喜欢四舍五入,但这是没有说明的,可能不太合适。是的,这个问题和参考都被标记为C#,但带有javascript内容。那么我假设的moment.js源代码是javascript呢?C#和javascript在计算日期方面有不同的想法。所以有时候人们会感到困惑。而且你们很多人不只是复制C#和javascript之间的算法。解决这种不方便的混淆的一个好方法是为javascript函数和C#函数创建单元测试,一些集成测试可能更好。是的,两者都有