c# - 十进制时间跨度年份和月份 c#

标签 c# datetime timestamp

我有两个十进制

3.10m = 3 years 10 months 
 2.8m = 2 years  8 months.

我正在尝试对这些值求和,结果是 5.9不正确

预期的结果应该是

6.6m = 6 years 6 months

任何人都可以建议我们如何使用 TimeSpan 或 C# 中的任何其他方式实现这一目标。提前致谢

最佳答案

首先,我会避免使用这样的小数来表示年/月值。如评论中所述,您将无法轻松区分 1 个月和 10 个月...而 decimal 可以 表示差异在 3.1 和 3.10 之间,这将是一个非常奇怪的用法。只需将这两个值保存在不同的整数中即可。

接下来,您不能使用 TimeSpan 进行这样的算术运算。 TimeSpan 仅存储“多个滴答声”——它不处理“1 个月”或“1 年”之类的想法,因为它们不代表固定的滴答声数。

我建议使用我的 Noda Time图书馆代替。您会将这些值表示为 Period 对象。您仍然无法直接将年和月相加 - Period 不假定公历系统,并且这样的算术不适用于某些非公历,尤其是那些根据年份改变月数。但是,您可以轻松编写自己的 Period 规范化方法:

using System;
using NodaTime;

class Test
{
    static void Main()
    {
        Period p1 = new PeriodBuilder { Years = 3, Months = 10 }.Build();
        Period p2 = new PeriodBuilder { Years = 5, Months = -12 }.Build();
        Period sum = p1 + p2;
        Period normalized = NormalizeYearsAndMonths(sum);
        Console.WriteLine($"{normalized.Years} years; {normalized.Months} months");
    }

    static Period NormalizeYearsAndMonths(Period period)
    {
        // TODO: Handle negative years and months however you want.
        int years = period.Years;
        int months = period.Months;
        years += months / 12;
        months = months % 12;
        var builder = period.ToBuilder();
        builder.Years = years;
        builder.Months = months;
        return builder.Build();
    }
}

当然,现在您可以只将所有内容保存在两个整数中 - 使用 Period 的好处是您可以轻松地将它添加到 LocalDate LocalDateTime 等。如果需要,您甚至可以在不规范化的情况下开始。

关于c# - 十进制时间跨度年份和月份 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52512749/

相关文章:

mysql - 如何在 MySQL 中查找与一组小时重叠的事件范围?

sql-server - 将两个sql表合并在一起的最佳方法

Java - SimpleDateFormat 格式化程序以毫秒为单位返回纪元时间

c# - 将 XML 映射到 C# 中的类

python - 为什么 Python 的 datetime.utcnow() 总是返回相同的微秒值?

C#按原始顺序获取FieldInfos/PropertyInfos?

java - 我如何反序列化以 jackson 为单位的时间戳?

java - 将时间戳转换为 weekNumber mapReduce

C#:为什么是 'bool' 而不是 'boolean'

c# - 从 XML 中删除出现的标记