Проверьте, сколько часов / дней прошло - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь создать функцию для вручения премии каждый час и каждый день.

Для этого я хочу реализовать функцию, которая дает 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);

Часы в этом случае будут равны 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.


Я также хочу, чтобы это работало, когда прошло несколько часов / дней.


Кто-нибудь может мне помочь?

Спасибо

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018

Самый простой способ - создать усеченные 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 DateTime вместо Local DateTime.

0 голосов
/ 09 сентября 2018

Мне кажется, что Math.Ceiling - самый простой способ сделать эту работу:

Пример:

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

Пример 2:

DateTime date0 = new DateTime(2018, 8, 9, 23, 59, 59);
DateTime date1 = new DateTime(2018, 8, 10, 00, 00, 00);
int DaysPassed = (int)Math.Ceiling(date1.Subtract(date0).TotalDays);
Console.WriteLine("Days "+ DaysPassed);
0 голосов
/ 09 сентября 2018

Если я вас правильно понимаю:

private static int GetHours(DateTime date1, DateTime date2)
{
    return Math.Max(0, Convert.ToInt32((date1 - date2).TotalMinutes / 60 + ((date1 - date2).TotalMinutes % 60 > 0 ? 1 : 0)));
}

Использование:

    DateTime date0 = new DateTime(2018, 8, 9, 20, 59, 59);
    DateTime date1 = new DateTime(2018, 8, 9, 21, 0, 0);                        
    Console.Write(GetHours(date1, date0).ToString());

Возвращает 1

Охват более суток:

    DateTime date0 = new DateTime(2018, 8, 9, 20, 59, 59);
    DateTime date1 = new DateTime(2018, 8, 10, 21, 0, 0);                       
    Console.Write(GetHours(date1, date0).ToString());

Возвращает 25

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...