C # /. NET Будущие относительные метки времени? - PullRequest
1 голос
/ 30 августа 2011

Я ищу способ сделать относительную текстовую метку времени, но использую будущее вместо прошлого (не "2 дня назад", а "через 2 дня").

Я создаю персональный диспетчер задач для своих личных нужд, и я хотел бы, чтобы он сказал мне, что «эта задача должна быть выполнена через 2 дня». Но я не могу найти ничего, чтобы преобразовать DateTime в такую ​​временную метку.

Ответы [ 6 ]

4 голосов
/ 30 августа 2011

Это не работает для вас? ...

DateTime myTask = DateTime.Now.AddDays(2.0);

Обновление

Как указал Рид в поле для комментариев ниже, ОП также может искать способСообщите время, когда задача должна быть выполнена, или время, когда задача была просрочена.Я думаю, что-то вроде этого будет работать (обратите внимание, что я не скомпилировал этот код, но он должен дать вам хорошую идею):

public string PrintTaskDueTime(DateTime taskTime, DateTime currTime)
{
    string result = string.Empty;
    TimeSpan timeDiff = TimeSpan.Zero;
    if(taskTime > currTime)
    {
        timeDiff = taskTime-currTime;
        result = String.Format("Your task is due in {0} days and {1} hours.", timeDiff.TotalDays, timeDiff.Hours);
    }
    else if(taskTime == currTime)
    {
        result = "Your task is due now!";
    }
    else
    {
        timeDiff = currTime-taskTime;
        result = String.Format("Your task is {0} days and {1} hours past due!", timeDiff.TotalDays, timeDiff.Hours);
    }

    return result;
}

Так что просто позвоните, указав время задачи и текущее время:PrintTimeDiff(taskTime, DateTime.Now);

Надеюсь, это поможет.

2 голосов
/ 30 августа 2011

Если у вас есть дата, которая должна быть в DateTime, то вы можете использовать TimeSpan, чтобы получить время до срока. Например:

TimeSpan dueDuration = dueDate - DateTime.Now;

Console.WriteLine("Due in {0} days and {1} hours.", dueDuration.TotalDays, dueDurations.Hours);
1 голос
/ 30 августа 2011

будущая относительная временная метка такая же, как в прошлом, но с другим знаком.

string RelativeTime(DateTime when)
{
     TimeSpan diff = when - DateTime.Now;
     var minutes = (int) diff.TotalMinutes;
     if (minutes == 1)
          return "A minute from now";

     if (minute == 2)
          return "In a couple minutes";

     if (minutes < 10)
          return "In not 10 minutes";

     if (minutes < 40)
          return "In about half an hour";

     /*  etc   */

}

Часть / * etc * / утомительна и требует творчества, но это зависит от вас.

0 голосов
/ 25 июня 2016

Вот кое-что, что я собрал, основываясь на ответе Джеймса.Поддерживает прошлое, настоящее и будущее:)

Примечание. Вероятно, его можно сократить еще немного.

public static string RelativeTime(DateTime Date, string NowText = "Now")
{
    const int SECOND = 1;
    const int MINUTE = 60 * SECOND;
    const int HOUR = 60 * MINUTE;
    const int DAY = 24 * HOUR;
    const int MONTH = 30 * DAY;

    TimeSpan TimeSpan;
    double delta = 0d;

    //It's in the future
    if (Date > DateTime.UtcNow)
    {
        TimeSpan = new TimeSpan(Date.Ticks - DateTime.UtcNow.Ticks);
        delta = Math.Abs(TimeSpan.TotalSeconds);
        if (delta < 1 * MINUTE)
        {
            if (TimeSpan.Seconds == 0)
                return NowText;
            else
                return TimeSpan.Seconds == 1 ? "A second from now" : TimeSpan.Seconds + " seconds from now";
        }
        if (delta < 2 * MINUTE)
            return "A minute from now";
        if (delta < 45 * MINUTE)
            return TimeSpan.Minutes + " minutes from now";
        if (delta < 90 * MINUTE)
            return "An hour from now";
        if (delta < 24 * HOUR)
            return TimeSpan.Hours + " hours from now";
        if (delta < 48 * HOUR)
            return "Tomorrow";
        if (delta < 30 * DAY)
            return TimeSpan.Days + " days from now";
        if (delta < 12 * MONTH)
        {
            int months = Convert.ToInt32(Math.Floor((double)TimeSpan.Days / 30));
            return months <= 1 ? "A month from now" : months + " months from now";
        }
        else
        {
            int years = Convert.ToInt32(Math.Floor((double)TimeSpan.Days / 365));
            return years <= 1 ? "A year from now" : years + " years from now";
        }
    }
    //It's in the past
    else if (Date < DateTime.UtcNow)
    {
        TimeSpan = new TimeSpan(DateTime.UtcNow.Ticks - Date.Ticks);
        delta = Math.Abs(TimeSpan.TotalSeconds);
        if (delta < 1 * MINUTE)
        {
            if (TimeSpan.Seconds == 0)
                return NowText;
            else
                return TimeSpan.Seconds == 1 ? "A second ago" : TimeSpan.Seconds + " seconds ago";
        }
        if (delta < 2 * MINUTE)
            return "A minute ago";
        if (delta < 45 * MINUTE)
            return TimeSpan.Minutes + " minutes ago";
        if (delta < 90 * MINUTE)
            return "An hour ago";
        if (delta < 24 * HOUR)
            return TimeSpan.Hours + " hours ago";
        if (delta < 48 * HOUR)
            return "Yesterday";
        if (delta < 30 * DAY)
            return TimeSpan.Days + " days ago";
        if (delta < 12 * MONTH)
        {
            int months = Convert.ToInt32(Math.Floor((double)TimeSpan.Days / 30));
            return months <= 1 ? "A month ago" : months + " months ago";
        }
        else
        {
            int years = Convert.ToInt32(Math.Floor((double)TimeSpan.Days / 365));
            return years <= 1 ? "A year ago" : years + " years ago";
        }
    }
    //It's now
    else
        return NowText;
}
0 голосов
/ 19 сентября 2011

Основываясь на всех ответах, я, наконец, сделал один, который отвечает всем моим требованиям:

public static string RemainingTimeBeforeDateTime(DateTime dateTime, int level = 1)
{
    int howDeep = 0;
    string result = "";

    TimeSpan dueDuration = dateTime - DateTime.Now;

    double days = dueDuration.Days;
    double hours = dueDuration.Hours;
    double minutes = dueDuration.Minutes;

    if (days > 0)
    {
        howDeep++;
        result = days + "d ";
    }

    if (((howDeep != level) && (days != 0)) || ((days == 0) && (hours > 0)))
    {
        howDeep++;
        result = result + hours + "h ";
    }

    if (((howDeep != level) && (hours != 0)) || ((hours == 0) && (minutes > 0)))
    {
        result = result + minutes + "m ";
    }

    return result;
}
0 голосов
/ 30 августа 2011

Тип DateTime используется для представления определенных моментов времени.Например, DateTime.Now .

TimeSpan используется для представления определенной продолжительности времени.Например, TimeSpan.FromDays (2) .

Существуют перегрузки операторов, которые позволяют им хорошо взаимодействовать друг с другом, например,

DateTime dueDate = DateTime.Now + TimeSpan.FromDays(2);
...