编程语言
首页 > 编程语言> > c# – Noda Time:Period.Between返回不正确的值

c# – Noda Time:Period.Between返回不正确的值

作者:互联网

我在使用NodaTime lib时遇到了麻烦.我的目标:计算两个日期之间的年/月/日.所以,这是我的测试示例:

    private static void Main()
    {
        var list = new List<Tuple<DateTime, DateTime>>
        {
            new Tuple<DateTime, DateTime>(new DateTime(1980, 1, 1), new DateTime(1983, 12, 31)),
            new Tuple<DateTime, DateTime>(new DateTime(2009, 1, 1), new DateTime(2015, 01, 23))
        };
        var totalPeriod = Period.Zero;
        foreach (var tuple in list)
        {
            var dateFrom = tuple.Item1;
            var dateTo = tuple.Item2;
            var ld1 = new LocalDate(dateFrom.Year, dateFrom.Month, dateFrom.Day);
            var ld2 = new LocalDate(dateTo.Year, dateTo.Month, dateTo.Day);
            var period = Period.Between(ld1, ld2, PeriodUnits.YearMonthDay);
            totalPeriod += period;
        }
        Console.WriteLine("Years: {0}, Months: {1}, Days: {2}", 
            totalPeriod.Years, 
            totalPeriod.Months,
            totalPeriod.Days);
        Console.Read();
    }

输出是:
年:9,月:11,天:52

这对我来说是不对的.我想得到,例如,下一个输出(当然,输出取决于月份的天数,假设我们这个月有31天):
年:10,月:0,天:21

所以,我希望那些日子可以分为几年和一个月.我怎么能得到这个?

答案:
使用Matt的答案我创建了下一个解决方案:

 foreach (var tuple in list)
        {
            var dateFrom = tuple.Item1;
            var dateTo = tuple.Item2;
            var period = Period.Between(LocalDateTime.FromDateTime(dateFrom).Date, LocalDateTime.FromDateTime(dateTo).Date, PeriodUnits.YearMonthDay);
            totalPeriod += period;
        }
        // trying clarify the period
        while(totalPeriod.Days >= 30)
        {
            totalPeriod = totalPeriod - Period.FromDays(30);
            totalPeriod = totalPeriod + Period.FromMonths(1);
            while (totalPeriod.Months >= 12)
            {
                totalPeriod = totalPeriod - Period.FromMonths(12);
                totalPeriod = totalPeriod + Period.FromYears(1);
            }
        }

解决方法:

理查德对OP的评论是正确的.问题是,月份和年份不是自己的不同数量.必须有一个参考框架来“计算”它们.当您执行Period.Between操作时,您有该引用,但是当您尝试将句点添加到一起时它会丢失.

如果您检查要添加的期间,则有意义:

First:  Years: 3, Months: 11, Days: 30
Second: Years: 6, Months: 0,  Days: 22
Total:  Years: 9, Months: 11, Days: 52

为了按照您的意愿进行舍入,添加到30天的22天将不知何故必须知道哪个月被引用.即使您保留了原始信息 – 您会使用哪一个?一方面你可以有28天的月份,另一方面可以有31天的月份.

你能做的最好的事情就是自己人为地围绕结果,然后选择一个平坦值(例如30天)代表所有月份.

哦,一件小事(与您的问题无关) – 要从DateTime转到LocalDate,请尝试LocalDateTime.FromDateTime(dt).Date.

标签:c,date,net,nodatime,period
来源: https://codeday.me/bug/20190624/1275817.html