【问题标题】:Getting number of months based on days in c#根据c#中的天数获取月数
【发布时间】:2011-10-15 12:50:02
【问题描述】:

我一直在努力解决这个问题..

我们的报告目前有一个日期标准,有天数限制,当然可以配置,目前设置为 90 天。消息说,它有 90 天的限制,但是我的老板想将其增加到 13 个月,不幸的是,如果我这样做了,我需要按天做,它会说,395 天..

不是一个非常友好的消息..

试图找出一种方法来满足这一点,我唯一的选择是添加另一个受月和天限制的设置。但是我仍然需要将月份转换回不完美的日子,因为不是每个月都有相同的日子..

想法?

【问题讨论】:

  • 您希望如何阅读消息?你想用几个月吗?几个月和几天的组合?最合适的单位(天、周、月、年……)?某种组合?
  • 怀疑我们会因为性能而使用年,想说 x 个月,x 天,仅基于天数.. 例如,如果我有 90 天,它会说 3 个月.. 或关闭到那个
  • 问题是,您将如何处理小数部分(90 天通常少于 3 个月,但有时更长)?

标签: c# asp.net date criteria


【解决方案1】:

使用TimeSpan object 执行日期条件所需的计算。

【讨论】:

  • 但 TimeSpan 不只给出天、小时、分钟、秒.. 需要几个月和几天吗?
  • Timespan 不能给你月数,因为这取决于开始日期,而 Timespan 没有。
  • 例如,对 DateTime.Now 的日期时间对象使用方法 .AddMonths .AddDays,然后使用 TimeSpan 对象从计算的日期中减去报表 CriteriaDate。根据结果​​,在 TimeSpan 中,日期是好还是不好。
  • 我从未说过 TimeSpan 对象有几个月。
  • TimeSpan 无法为 OP 提供他所需要的(月)。
【解决方案2】:

您需要决定是使用 13 个月作为时间间隔,还是使用大约 13 个月的天数。如果您使用 13 个月,那么天数(或报告的结束日期)将根据开始日期而有所不同。

我建议您将报告配置为几个月或几天(不仅存储数字,还存储配置中的单位)。然后,您可以在报告上显示配置中指定的任何内容(也包括配置中的单位),并通过将配置的已配置单位数与开始日期相加来计算查询的结束日期。

如果你试图在几天内完成所有事情,而现在你要在几个月内工作,你只会让自己的生活变得困难。

将开始日期加上 13 个月以获得结束日期要比尝试(不准确地)计算出给定天数中的月份要容易得多。

【讨论】:

    【解决方案3】:

    考虑到天数,我会做这样的事情:

    int myDays;   // 390 or whatever
    DateTime d1 = DateTime.Now;
    DateTime d2 = d1.AddDays(myDays);
    int monthsDiff = d2.Month - d1.Month + 12 * (d2.Year - d1.Year);
    DateTime d3 = d1.AddMonths(monthsDiff);
    TimeSpan tf = d2 - d3;
    string msg = monthsDiff.ToString() + " months, " + tf.Days + " days";
    

    【讨论】:

      【解决方案4】:

      TimeSpan 为您提供两个 DateTime 对象之间的持续时间。它可以在几天、几小时或几分钟内始终如一地给出它;月数会根据实际开始和结束日期而有所不同,因为不同的月份有不同的实际天数。

      话虽如此,您始终可以编写一个实用程序方法,该方法为您提供YourTimeSpan 对象,该对象根据您的日历和 StartDate / EndDates 为您提供月份数等。

      在您的情况下,您可以通过将其单独存储在配置中来使其更简单,例如 - ReportDuration_YearsReportDuration_MonthsReportDuration_Days。这将允许您在报告中创建有意义的标签,并允许正确识别 StartDate 和 EndDate。

      //Call this by passing values from configuration
      private string GetNiceLookingLable(int? years, int? months, int? days){
          var yearMessage = (years.HasValue)?String.Format("{0} Years", years):String.Empty;
          var monthMessage = (months.HasValue)?String.Format("{0} Months", months):String.Empty;
          var daysMessage = (days.HasValue)?String.Format("{0} Days", days):String.Empty;
      
          // You probably want to concatenate them properly
          return String.Format("{0} {1} {2}",yearMessage, monthMessage, daysMessage);
      }
      

      -

      //Call this to get starting date
      private DateTime getStartingDate(int? years, int? months,int? days){
           var retDate = DateTime.Today;
           if(years.HasValue){
               retDate = retDate.AddYears(-1*years.Value);
           }
           if(months.HasValue){
               retDate = retDate.AddMonths(-1*months.Value);
           }
           if(days.HasValue){
               retDate = retDate.AddDays(-1*days.Value);
           }
      
           return retDate;
      }
      

      【讨论】:

        猜你喜欢
        • 2014-05-22
        • 1970-01-01
        • 1970-01-01
        • 2012-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-15
        相关资源
        最近更新 更多