首页 > 解决方案 > 检查经过了多少小时/天

问题描述


我正在尝试创建一个功能,以每小时和每天进行奖励。

为此,我想实现一个给定 2 DateTime 检查经过多少小时/天的函数。

我已经有一个协程可以每秒调用该函数。

例如,我想每隔 00:00:00、01:00:00 ... 12:00:00 ... 23:00:00 颁奖


例子:

DateTime date0 = new DateTime(2018, 8, 9, 20, 59, 59);
DateTime date1 = new DateTime(2018, 8, 9, 21, 0, 0);
int hoursPassed = (int) date1.Subtract(date0).TotalHours;
Debug.Log("Hours "+ hoursPassed);

在这种情况下,hoursPassed 将等于 0。我想创建一个函数(可能已经存在)来检索我 1 。日子也一样。


示例 2

DateTime date0 = new DateTime(2018, 8, 9, 23, 59, 59);
    DateTime date1 = new DateTime(2018, 8, 10, 00, 00, 00);
    int DaysPassed = (int) date1.Subtract(date0).TotalDays;
    Debug.Log("Days "+ DaysPassed);

它将检索 0,我想检索 1。


我也希望它在多个小时/天过去后工作。


有谁能够帮我?

谢谢

标签: c#datetimetime

解决方案


最简单的方法是通过在仅对小时感兴趣时去除分钟/秒以及在仅对天感兴趣时通过修剪小时/分钟/秒来创建修剪变量。 DateTime然后计算小时或天的差异。

// Calculates the number of hour strikes between the two given times
public static int HourStrikesBetween(DateTime from, DateTime to)
{
    if(from > to)
    {
        throw new ArgumentException("from must not be after to");
    }

    // Trim to hours
    DateTime fromTrimmed = new DateTime(from.Year, from.Month, from.Day, from.Hour, 0, 0);
    DateTime toTrimmed = new DateTime(to.Year, to.Month, to.Day, to.Hour, 0, 0);

    int hours = (int)(toTrimmed - fromTrimmed).TotalHours;

    return hours;
}

// Calculates the number of midnights between the two given times
public static int MidnightsBetween(DateTime from, DateTime to)
{
    if (from > to)
    {
        throw new ArgumentException("from must not be after to");
    }

    // Trim to days
    DateTime fromTrimmed = new DateTime(from.Year, from.Month, from.Day);
    DateTime toTrimmed = new DateTime(to.Year, to.Month, to.Day);

    int days = (toTrimmed - fromTrimmed).Days;

    return days;
}

样本:

DateTime date0 = new DateTime(2018, 8, 9, 20, 59, 59);
DateTime date1 = new DateTime(2018, 8, 9, 21, 0, 0);
int hourspassed = HourStrikesBetween(date0, date1);  // = 1

date0 = new DateTime(2018, 8, 9, 20, 00, 00);
date1 = new DateTime(2018, 8, 9, 21, 50, 0);
hourspassed = HourStrikesBetween(date0, date1);  // = still 1

date0 = new DateTime(2018, 8, 9, 20, 59, 59);
date1 = new DateTime(2018, 8, 9, 22, 10, 0);
hourspassed = HourStrikesBetween(date0, date1);  // = 2


date0 = new DateTime(2018, 8, 9, 23, 59, 59);
date1 = new DateTime(2018, 8, 10, 00, 00, 00);
int daysPassed = MidnightsBetween(date0, date1);  // = 1

请注意,如果您始终使用 UTC 日期时间而不是本地日期时间,这只会在跨越夏令时边界时起作用。


推荐阅读