Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 野田时间:返回错误值之间的时间段_C#_.net_Date_Period_Nodatime - Fatal编程技术网

C# 野田时间:返回错误值之间的时间段

C# 野田时间:返回错误值之间的时间段,c#,.net,date,period,nodatime,C#,.net,Date,Period,Nodatime,我的NodaTime lib有问题。我的目标是:计算两个日期之间的年/月/日期。下面是我的测试示例: private static void Main() { var list = new List<Tuple<DateTime, DateTime>> { new Tuple<DateTime, DateTime>(new DateTime(1980, 1, 1), new DateTim

我的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();
    }

Richard对OP的评论是正确的。问题是月份和年份本身并不是不同的数量。一个人必须有一个参照系来“计算”它们。当您执行
Period.Between
操作时,您就有了该引用,但当您尝试将这些期间添加到一起时,它就丢失了

如果您检查要添加的时段,则有意义:

First:  Years: 3, Months: 11, Days: 30
Second: Years: 6, Months: 0,  Days: 22
Total:  Years: 9, Months: 11, Days: 52
为了按照您的意愿进行取整,将22天添加到30天中,您必须知道引用的月份。即使您保留了原始信息,您会使用哪一个?一方面你可以有一个28天的月,另一方面你可以有一个31天的月

最好是在事后自己人为地对结果进行四舍五入,然后选择一个统一的值(例如30天)来表示所有月份


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

我相信@jonskeet会跳上这一步的。但是,
Period
如何将52天汇总到1个月21天?每个月都有不同的天数!s老实说,我不认为你的“下一个解决方案”特别好。如果您只想要两个日期之间的差异,为什么不使用一次
Period.between
?用月份和年份来规范月经周期对我来说听起来不是个好主意。见鬼,如果你把从1月1日到1月2日,然后是1月2日到1月3日的每一段时间加起来,直到12月31日和1月1日,你不会得到一年。这里的大局是什么?你到底想达到什么目的?你可能只想收集天数(你可以用PeriodUnits来做),我将解释我想要得到什么。我应该得到一个公民的就业期限应该以年、月、日为单位。迈克·史密斯是一名程序员。他从1980年1月1日开始在微软工作。他于1983年12月31日离开微软。此后,他直到2009年1月1日才在任何地方工作。自2009年1月1日起,他开始在谷歌工作。他于2015年1月23日离开谷歌。因此,总共有两个阶段:第一阶段=1980年1月1日-1983年12月31日第二阶段=2009年1月1日-2015年1月23日结果我应该得到:年:10,月:0,天:21但我得到:年:9,月:11,天:52这个结果对我来说是不正确的。我知道我的“下一个解决方案”是气味。但我不知道怎么才能得到准确的答案。谢谢你,马特!当我写那个问题时,我假设这个选项,但我认为有一个确切的解决方案。我将在问题中发布我的结果代码。另外,非常感谢您提供LocalDateTime。FromDateTime(dt)。日期方式:)这真的很有帮助!
First:  Years: 3, Months: 11, Days: 30
Second: Years: 6, Months: 0,  Days: 22
Total:  Years: 9, Months: 11, Days: 52