如何将天数转换为年、月和日[重复]

Posted

技术标签:

【中文标题】如何将天数转换为年、月和日[重复]【英文标题】:How to convert number of days to years,months and days [duplicate] 【发布时间】:2013-11-07 01:32:40 【问题描述】:

如果我有两个日期,那么我会在天数内得到它们之间的差异,就像这样Post。


如何在以下视图中详细说明:

将日期转换为 (number of years,number of months and the rest in the number of days)

【问题讨论】:

有一个名为 Nodatime 的库,它在这类事情上比 DateTime 更好,创建者有一个很好的答案 here 关于如何在 Nodatime 中执行此操作。 在***.com/questions/453208/… URL 上提出了类似的问题。 你应该用几个例子来详细说明。 @HenkHolterman :如果我有66272 作为天数,那么我想要那个数字中的年数、月数和天数。 那是多少年/天?而对于 45772 ?而对于 32321、9801、1700 呢? 【参考方案1】:

你不能,因为它取决于开始日期 即 30 天可以是 1 个月 1 天,或 1 个月 2 天,或少于一个月或 如果是闰年,365天将少于一年

【讨论】:

当然可以。这只是定义问题。 @HenkHolterman :我不希望它那么精确,我建议所有年份 = 365 和所有月份 = 30 所以给定我想要的天数(年、月、日)。我有天数而不是两个日期。【参考方案2】:

对此没有开箱即用的解决方案。问题是数据不是“固定的”,例如并非所有年份都是 365 天(闰年为 366 天),也不是每个月都可以假定为标准 30 天。

在没有上下文的情况下很难计算出这类信息。但是,您有一个以天为单位的持续时间,以准确计算您需要确切知道这些天何时落下的年/月数,即在哪一个月和哪一年 - 这将允许您确定该月的确切天数和/或年份。


根据您的 cmets 和以下条件

1 年 = 365 天 1 个月 = 30 天

那么下面的代码就可以完成这项工作

DateTime startDate = new DateTime(2010, 1, 1);
DateTime endDate = new DateTime(2013, 1, 10);
var totalDays = (endDate - startDate).TotalDays;
var totalYears = Math.Truncate(totalDays / 365);
var totalMonths = Math.Truncate((totalDays % 365) / 30);
var remainingDays = Math.Truncate((totalDays % 365) % 30);
Console.WriteLine("Estimated duration is 0 year(s), 1 month(s) and 2 day(s)", totalYears, totalMonths, remainingDays);

【讨论】:

@James 谢谢你......它给出了很好的结果并解决了我最大的问题...... +1 由于缺少已知数据,此代码非常不准确,并且在某种程度上是公认的答案。每个月都有固定的天数,除了 2 月有 28 或 29 天,因此您计算闰年 (year%4 == 0) 并开始看到一些准确性。没有理由需要进行估算 答错了,请删除【参考方案3】:

正如前面的答案中提到的,仅仅几天就很难解决这个问题。闰年和月中的天数存在问题。如果您从原始的两个日期时间开始,您可以使用类似于以下的代码:

DateTime date1 = new DateTime(2010, 1, 18);
DateTime date2 = new DateTime(2013, 2, 22);

int oldMonth = date2.Month;
while (oldMonth == date2.Month)

     date1 = date1.AddDays(-1);
     date2 = date2.AddDays(-1);
       

int years = 0, months = 0, days = 0, hours = 0, minutes = 0, seconds = 0, milliseconds = 0;

// getting number of years
while (date2.CompareTo(date1) >= 0)

     years++;
     date2 = date2.AddYears(-1);

date2 = date2.AddYears(1);
years--;


// getting number of months and days
oldMonth = date2.Month;
while (date2.CompareTo(date1) >= 0)

     days++;
     date2 = date2.AddDays(-1);
     if ((date2.CompareTo(date1) >= 0) && (oldMonth != date2.Month))
     
          months++;
          days = 0;
          oldMonth = date2.Month;
     

date2 = date2.AddDays(1);
days--;

TimeSpan difference = date2.Subtract(date1);

Console.WriteLine("Difference: " +
                    years.ToString() + " year(s)" +
                    ", " + months.ToString() + " month(s)" +
                    ", " + days.ToString() + " day(s)");

输出为:Difference: 3 year(s), 1 month(s), 4 day(s)

【讨论】:

我可以想象这个算法在给定两个相距较远的日期的情况下执行真的缓慢。 现在是星期一早上。我的表现真的很慢,不要介意算法 我尝试了这段代码并计算了我的年龄。它在 0.0045 毫秒内给了我正确的结果。 我计算了相隔 1000 年 1 个月零 4 天的日期。耗时 0.6867 毫秒 @tomsullivan1989 毫无疑问,您使用的是相对强大的开发机器,除非应用程序将在您可以控制的服务器上运行,您需要考虑客户端机器的性能。我在项目管理模块上被类似的东西刺痛了,我们在其中进行了类似的计算,并且对于一两个简单的操作都很好……想象一下尝试执行相同的操作 100 次……可能不适用于这里,但我想值得一提。

以上是关于如何将天数转换为年、月和日[重复]的主要内容,如果未能解决你的问题,请参考以下文章

输入一个天数和年,求月和日(有平年和闰年)

输入一个天数和年,求月和日(有平年和闰年)

检测和求和年、月和日

JS 如何获取当前上一个月下一个月和月份所含天数

如何将年、月和日列合并到单个日期时间列?

Javascript:计算给定年份的月份天数