2011-02-04 15 views
3

私は過去2日間にCS 462オフィスアワーアプリを作成しました。 most recent iterationは、次の勤務時間ブロックがいつ来るかをユーザーに知らせます。今のところ、それは「午後3時に木曜日(2月3日)」としてフォーマットされます。私は少し賢くなりたいと思って、 "今日の午後3時"や "明日の午前10時"のように言う。タイムスタンプの相対フォーマット

これはツイートのTwitterの相対タイムスタンプと似ています(「3分前」または「23時間前」と表示されます)。私の場合は、将来の時代を扱っているので、それは逆になります。

基本的には、イベントが今日または明日であることを知るには十分スマートである必要があります。それを超えて、私はちょうど日付と曜日を表示したい。

KRLでこれを行う方法はありますか?ロジックlike thisを使用し、関数(またはモジュール)を書くだけでいいですか?

答えて

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

現在、KRLでこれを行う機能は組み込まれていません。これを行うには、おそらく関数やモジュールを書く必要があります。

+0

私は1つを取り組んできましたが、それはまだ完了していません。私が終わったらここに投稿します。 –