时间戳的相对格式

时间:2011-02-04 18:35:32

标签: krl

我在过去两天写了CS 462办公时间应用程序。 most recent iteration告诉用户下一个办公时间时间段的时间。现在,它只是将其格式化为“星期四(2月3日)下午3点”。不过,我希望它更聪明一些,并说“今天下午3点”或“明天上午10点”。

这类似于Twitter在推文上的相对时间戳(它表示“3分钟前”或“23小时前”;除此之外它列出了日期)。但就我而言,情况正好相反,因为我们正在处理未来的事情。

基本上,它需要足够聪明才能知道事件是今天还是明天。除此之外,我只想显示一周中的日期和日期。

有没有办法用KRL做到这一点?我只需要使用逻辑like this并编写一个函数(或模块)吗?

2 个答案:

答案 0 :(得分: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;
}

然而,这似乎还没有奏效。我得到了这个输出:

Incorrect relative times

有人能看出什么问题吗?

答案 1 :(得分:1)

目前在KRL中没有内置功能。您可能需要编写一个函数或模块来执行此操作,我很乐意在您执行此操作时查看它。