Относительное форматирование временных меток

Я написал приложение CS 462 Office Hours за последние два дня. последняя итерация сообщает пользователю, когда будет следующий рабочий день. Прямо сейчас он просто форматирует его как «Четверг (3 февраля) в 15:00». Однако я бы хотел, чтобы он был немного умнее и говорил что-то вроде «сегодня в 15:00» или «завтра в 10:00».

Это похоже на относительные временные метки Твиттера в твитах (там написано «3 минуты назад» или «23 часа назад»; помимо этого указывается дата). Однако в моем случае все будет наоборот, поскольку мы имеем дело с будущими временами.

По сути, он должен быть достаточно умным, чтобы знать, что событие сегодня или завтра. Кроме того, я просто хочу отображать дату и день недели.

Есть ли способ сделать это с KRL? Мне просто нужно использовать логику подобную этой и написать функцию (или модуль )?


krl
person Steve Nay    schedule 04.02.2011    source источник


Ответы (2)


Это функции, которые у меня есть:

// First define some constants to measuring relative time
now = time:now({"tz": "America/Denver"});
midnight = time:new("23:59:59.000-07:00");
tomorrow_midnight = time:add(midnight, {"days": 1});
yesterday_midnight = time:add(midnight, {"days": -1});

// Functions for calculating relative time
relativefuturedate = function(d){
  ispast(d) => "today (past) at " + justtime(d)
    | istoday(d) => "today at " + justtime(d)
    | istomorrow(d) => "tomorrow at " + justtime(d)
    | datetime(d);
};

istoday = function(d){
  d > now && d <= midnight;
};

istomorrow = function(d){
  not istoday(d) && d <= tomorrow_midnight;
};

ispast = function(d){
  d < now;
};

isfuture = function(d){
  d > now;
};

justtime = function(d){
  time:strftime(d, "%l:%M %p");
};

datetime = function(d){
  time:strftime(d, "%A (%B %e) at %l:%M %p");
};

Это должно сработать. Прямо сейчас я тестирую это с этим правилом:

rule first_rule {
  select when pageview ".*"
  pre {
    today_9 = time:new("2011-02-09T09:00:00.000-07:00");
    today_12 = time:new("2011-02-09T12:00:00.000-07:00");
    today_4  = time:new("2011-02-09T16:00:00.000-07:00");
    tomorrow_9 = time:new("2011-02-10T09:00:00.000-07:00");
    tomorrow_4 = time:new("2011-02-10T16:00:00.000-07:00");
    nextday_9 = time:new("2011-02-11T09:00:00.000-07:00");

    relative_now = relativefuturedate(now);
    relative_today_9 = relativefuturedate(today_9);
    relative_today_12 = relativefuturedate(today_12);
    relative_today_4 = relativefuturedate(today_4);
    relative_tomorrow_9 = relativefuturedate(tomorrow_9);
    relative_tomorrow_4 = relativefuturedate(tomorrow_4);
    relative_nextday_9 = relativefuturedate(nextday_9);

    message = <<
      Now: #{relative_now}<br />
      Today at 9: #{relative_today_9}<br />
      Today at 12: #{relative_today_12}<br />
      Today at 4: #{relative_today_4}<br />
      Tomorrow at 9: #{relative_tomorrow_9}<br />
      Tomorrow at 4: #{relative_tomorrow_4}<br />
      Day after tomorrow at 9: #{relative_nextday_9}<br />
    >>;
  }
  notify("Time calculations:", message) with sticky=true;
}

Однако, похоже, это еще не работает. Я получаю этот вывод:

Неверное относительное время

Кто-нибудь может увидеть, что не так?

person Steve Nay    schedule 09.02.2011

В настоящее время в KRL нет встроенных функций для этого. Вам, вероятно, потребуется написать функцию или модуль, чтобы сделать это, и я хотел бы увидеть это, если/когда вы это сделаете.

person Mike Grace    schedule 07.02.2011
comment
Я работал над одним, но он еще не совсем готов. Я опубликую это здесь, когда закончу. - person Steve Nay; 07.02.2011