首页 > 解决方案 > 计算两个给定日期之间的银行假期并以分钟为单位显示差异

问题描述

我正在尝试计算两个给定日期之间的银行假期数量,例如 31/10/2019 10:00:00 和 01/11/2019 08:00:00 假设 01/11/2019 是银行假期。我应该以分钟为单位得到银行假日的差异,总共 480 分钟。我正在使用以下代码,如果给定日期与银行假日在同一日期,那么我的代码返回 1440,这是错误的,有人可以建议如何实现这一点。谢谢

 DateTime firstDay = new DateTime(2019, 10, 31, 10, 0, 0);
DateTime lastDay = new DateTime(2019, 11, 1, 8, 0, 0);

public static int CountOfBusinessClosures(DateTime firstDay, DateTime lastDay, IOrganizationService service)
{
   // firstDay = firstDay.Date;
   // lastDay = lastDay.Date;

    var count = 0;         

    var businessClosuresdate = new DateTime(2019, 11, 1, 0, 0, 0);//GetBusinessClosureCalendarRules(service);

    // Count the number of bank holidays in between the given dates

    if (firstDay <= businessClosuresdate && businessClosuresdate <= lastDay)
    {
        count++;
    }

    return count;
}

或者

 public static double CountOfBusinessClosures2(DateTime firstDay, DateTime lastDay, IOrganizationService service)
    {
       var firstDay1 = firstDay.Date;
       var lastDay1 = lastDay.Date;

        var count = 0;            
        double t = 0;           

       // var businessClosures = GetBusinessClosureCalendarRules(service);

        // Count the number of bank holidays during the time interval
       // foreach (var closure in businessClosures)
       // {               
            var startDate = 01/11/2019 00:00:00 //(DateTime)closure["effectiveintervalstart"];
            var endDate = 02/11/2019 00:00:00 // (DateTime)closure["effectiveintervalend"];
            DateTime bh1 = startDate.Date;

            if (firstDay1 <= bh1 && bh1 <= lastDay1)
            {
                //  count++;
                if (firstDay.Date < startDate.Date && startDate.Date != endDate.Date)
                {
                    t += 1440; // 24h * 60 min
                }

                else
                {
                    double difference;
                    difference = (endDate - startDate).TotalMinutes;
                    difference = difference - (firstDay - startDate).TotalMinutes;
                    t += difference;
                }

            }
       // }
        return t;
    }

private static IEnumerable<Entity> GetBusinessClosureCalendarRules(IOrganizationService service)
    {

        // Get Organization Business Closure Calendar Id
        var organization = service.Retrieve("organization", _orgId, new ColumnSet("businessclosurecalendarid"));

        var query = new QueryExpression("calendar")
        {
            ColumnSet = new ColumnSet(true),
            Criteria = new FilterExpression()
        };

        // Add condition to get Get Calander where CalanderId is equal to Organization's businessclosurecalendarid
        query.Criteria.AddCondition(new ConditionExpression("calendarid", ConditionOperator.Equal, organization["businessclosurecalendarid"].ToString()));

        // Get Calendar
        var businessClosureCalendar = service.RetrieveMultiple(query).Entities[0];
        return businessClosureCalendar == null || businessClosureCalendar.GetAttributeValue<EntityCollection>("calendarrules") == null ? null : businessClosureCalendar.GetAttributeValue<EntityCollection>("calendarrules").Entities;
    }

标签: c#c#-4.0dynamics-crmc#-3.0dynamics-crm-2013

解决方案


@Bellam 试试这个,看看它是否适合您的需求:

// Unit Test Class
[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void C58840237T01()
    {
        DateTime firstDay = new DateTime(2019, 10, 31, 0, 0, 0);
        DateTime lastDay = new DateTime(2019, 11, 1, 0, 0, 0);
        double totalMinutesBusinessIsClosed = C58840237.MinutesBusinessIsClosed(firstDay, lastDay);
        Assert.IsTrue(totalMinutesBusinessIsClosed == 480);
    }
}


// Sample Class
public class C58840237
{
    public static double MinutesBusinessIsClosed(DateTime firstDay, DateTime lastDay)
    {
        double t = 0;

        // Holiday 01
        var h01Start = Convert.ToDateTime("11/01/2019 08:00:00");
        var h01End = Convert.ToDateTime("11/01/2019 16:00:00");

        // Holiday is in range
        if (firstDay <= h01Start && h01Start >= lastDay)
        {
            return (h01End - h01Start).TotalMinutes;
        }

        return t;
    }
}

编辑:我意识到我们的日期时间格式不同,但这很容易调整。


推荐阅读