C# C控制台应用程序,如何计算任何持续时间的移动账单?

C# C控制台应用程序,如何计算任何持续时间的移动账单?,c#,algorithm,datetime,billing,C#,Algorithm,Datetime,Billing,假设我们的手机通话有两个计费周期,如果我们在0-12之间通话,则通话费率为1美元/分钟;如果我们在12-24之间通话,则费率为2美元/分钟。通话可以在任何时间开始,持续任何时间。我需要计算通话时间的账单。我越来越难以使用datetime类型。我还需要一个更好的算法来计算账单。我正在尝试这样的事情: DateTime StartTime, EndTime; decimal Bill = 0; decimal RemainingDuration;

假设我们的手机通话有两个计费周期,如果我们在0-12之间通话,则通话费率为1美元/分钟;如果我们在12-24之间通话,则费率为2美元/分钟。通话可以在任何时间开始,持续任何时间。我需要计算通话时间的账单。我越来越难以使用datetime类型。我还需要一个更好的算法来计算账单。我正在尝试这样的事情:

DateTime StartTime, EndTime;
        decimal Bill = 0;
        decimal RemainingDuration;


        StartTime = DateTime.Now;

        EndTime = DateTime.Now.AddHours(2.5);

        var Duration = (EndTime.ToString("H:mm") - StartTime.ToString("H:mm"));

        if (StartTime.Hour > 0 && StartTime.Hour < 12)
        {
            //var RemainingTime = 12.00 - StartTime;
            //if (Duration < RemainingTime)
            //{
            //    Bill = (Duration * 60) * 1;
            //    Console.WriteLine(Bill);
            //}
            //else
            //{
            //    RemainingDuration = Duration - RemainingTime;
            //    Bill = ((RemainingTime * 60) * 1) + ((RemainingDuration * 60) * 2);
            //    Console.WriteLine(Bill);
            //}

        }
        else if (StartTime.Hour > 12 && StartTime.Hour < 24)
        {
            //var RemainingTime = 24.00 - StartTime.Hour;

            //if (Duration < RemainingTime)
            //{
            //    Bill = (Duration * 60) * 2;
            //    Console.WriteLine(Bill);
            //}
            //else
            //{
            //    RemainingDuration = Duration - RemainingTime;
            //    Bill = ((RemainingTime * 60) * 2) + ((RemainingDuration * 60) * 1);
            //    Console.WriteLine(Bill);
            //}
        }
        Console.ReadLine();

类型未匹配有一些错误。这些错误并不是我最关心的问题,我编写这段代码时假设呼叫持续时间最长为24小时。我需要写无限期。也很难转换类型。代码示例将非常有用。谢谢

您得到了一个类型不匹配,因为您在尝试对日期时间进行算术运算之前将日期时间转换为字符串。至于算法,当然有上千种方法可以实现,但这里有一个简单的例子可以解决24小时的问题,也许能给你更多的想法

decimal bill = 0;            

DateTime startTime = DateTime.Now;
DateTime endTime = DateTime.Now.AddHours(2.5);
DateTime timeNow = startTime;

while (timeNow <= endTime)
{                
    decimal rate = (timeNow.Hour >= 12 && timeNow.Hour <= 24) ? 2 : 1;                
    bill = bill + rate;
    Console.WriteLine("{0:HH:mm}, rate: ${1:#,0.00}, bill: ${2:#,0.00}", timeNow, rate, bill);
    timeNow = timeNow.AddMinutes(1);
}

Console.WriteLine("Bill: {0:HH:mm} to {1:HH:mm}, {2:#,0} mins, ${3:#,0.00}", startTime, endTime, (endTime - startTime).TotalMinutes, bill);

Console.ReadLine();

阅读错误消息。你不应该使用vard。你认为减去两个字符串意味着什么。这里错误不是我主要关心的问题,我编写此代码时假设呼叫持续时间最长为24小时。我需要写无限期。也很难转换类型。代码示例将非常有用。谢谢。你可以看到,我注释掉了那些部分,我尝试了不同类型的转换。我需要的是从datetime类型中提取时间部分&然后比较两个时间部分。我该怎么做?谢谢,伙计,写得很好。我将尝试无限期地延长它。我认为你的答案是正确的。