当前位置: 首页 > 知识库问答 >
问题:

野田佳彦时间:句号。在返回错误值之间

年烈
2023-03-14

我在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

所以,我想把日子四舍五入到年和月。我怎么能得到这个?

答案:利用马特的答案,我创造了下一个解决方案:

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

共有1个答案

卜盛
2023-03-14

理查德在这篇文章中的评论是对的。问题是,月份和年份本身并不是不同的数量。一个人必须有一个参照系来“数一数”。当你做句点时,你就有了这个参考。在操作之间,但当您尝试将句点添加到一起时,它将丢失。

如果您检查要添加的句点,这是有意义的:

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)。日期:)

 类似资料:
  • 鉴于下面的代码片段,为什么最后四个输出周期是相同的?我希望这些行的天数部分是4,3,2,1,而不是4,4,4,4。这是一个错误还是我遗漏了一些明显的东西?(天晚了,我很累,所以很可能是后者。)我用的是野田佳彦时间1.2.0。

  • 问题内容: 我刚刚发现这可以工作: 但这不是: 而“。” 两者均可。 这里的句号和逗号有什么区别? 问题答案: 只允许一个表达式。但是允许使用一个表达式列表,其中每个表达式用逗号分隔。但是请注意,由于不是函数而是特殊的语言构造,因此将表达式列表用括号括起来是非法的。

  • 问题内容: 我正在尝试使用获取Swift中的当前日期。创建断点并停止应用程序时,我发现设备的系统时间相差3个小时。应用程序正在真实的iPhone上运行。如何解决这个问题? 我还确保在App Delegate中编写以下内容: 但这仍然行不通。 问题答案: 它不会返回错误的时间。它返回正确的时间。NSDate没有任何时区信息。现在,当我们调用NSDate()时,我的计算机和您的计算机将报告完全相同的时

  • 问题内容: 好的,有没有一种方法可以从函数中返回值-该方法可以-但不能 停止 该函数-该方法可以呢? 我需要这个,所以我可以经常返回值。(由或其他方式提供的延迟。) 问题答案: 我想你在找。例:

  • 我试图在pyplay中制作一个2D游戏,并有一个具有表面属性的相机类,每次相机更新时,其表面都会更新。所有图形都game.world表面,然后主相机拍摄一张照片,并将其显示在显示表面。然而,当使用其他相机时,我无法将其遮挡到世界表面并获得锁定错误。我已经尝试过了。解锁()。什么会导致这种情况?