Estoy tratando de hacer una función para otorgar un premio cada hora y todos los días.

Para eso quiero implementar una función que da 2 DateTime compruebe cuántas horas / días pasaron.

Ya tengo una Corutina para llamar a esa función cada segundo.

Por ejemplo, quiero otorgar premios cada 00:00:00, 01:00:00 ... 12:00:00 ... 23:00:00


Ejemplo:

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);

Las horas pasadas serán iguales a 0 en este caso. Quiero hacer una función (tal vez ya existe) que me recupere 1 en su lugar. Lo mismo con los días.


Ejemplo 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);

Recuperará 0 y quiero recuperar 1.


También quiero que esto funcione cuando hayan pasado varias horas / días.


¿Alguien puede ayudarme?

Gracias

-1
Goncalo Diogo 9 sep. 2018 a las 02:11

3 respuestas

La mejor respuesta

La forma más fácil es crear variables recortadas DateTime quitando minutos / segundos cuando solo le interesan las horas y recortando horas / minutos / segundos cuando solo le interesan los días. Luego calcule la diferencia en horas o días.

// 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;
}

Muestra:

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

Tenga en cuenta que esto solo funcionará cuando cruce los límites del horario de verano si usa constantemente UTC DateTime en lugar de Local DateTime.

0
NineBerry 9 sep. 2018 a las 00:30

Me parece que Math.Ceiling es la forma más fácil de hacer que esto funcione:

Ejemplo:

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);

Ejemplo 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);
-1
Enigmativity 9 sep. 2018 a las 01:00

Si te entiendo correctamente:

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)));
}

Uso:

    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());

Devuelve 1

Que abarca más de un día:

    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());

Devuelve 25

0
HaukurHaf 8 sep. 2018 a las 23:25