瀏覽代碼

merge branch 'prettier-times'

Lucas Stadler 11 年之前
父節點
當前提交
e60b0dcf65
共有 1 個文件被更改,包括 50 次插入10 次删除
  1. 50 10
      elm/PrettyDate.elm

+ 50 - 10
elm/PrettyDate.elm

@ -8,10 +8,44 @@ prettyDate reference date =
8 8
    let referenceSeconds = Date.toTime reference
9 9
        dateSeconds = Date.toTime date
10 10
        diffSeconds = referenceSeconds - dateSeconds
11
    in format diffSeconds
11
    in format << toRelativeTime <| diffSeconds
12 12
13
format : Float -> String
14
format diff =
13
type RelativeUnit = JustNow
14
                  | Minute
15
                  | Hour
16
                  | Day
17
                  | Week
18
                  | Month
19
                  | Year
20
21
type RelativeTime = Past RelativeUnit Int
22
                  | Future RelativeUnit Int
23
24
stringForm relativeUnit =
25
    case relativeUnit of
26
      Minute  -> ("a minute", "minutes")
27
      Hour    -> ("an hour", "hours")
28
      Day     -> ("a day", "days")
29
      Week    -> ("a week", "weeks")
30
      Month   -> ("a month", "months")
31
      Year    -> ("a year", "years")
32
33
format : RelativeTime -> String
34
format relativeTime =
35
    case relativeTime of
36
      Past   JustNow _ -> "moments ago"
37
      Future JustNow _ -> "in a moment"
38
      Past   unit n    -> format' ""    " ago" unit n
39
      Future unit n    -> format' "in " ""     unit n
40
41
format' prefix suffix unit n =
42
    let (singular, plural) = stringForm unit
43
    in if n == 1
44
       then prefix ++ singular
45
       else prefix ++ toString n ++ " " ++ plural ++ suffix
46
47
toRelativeTime : Float -> RelativeTime
48
toRelativeTime origDiff =
15 49
    let minute = 60 * 1000
16 50
        hour = 60 * minute
17 51
        day = 24 * hour
@ -19,10 +53,16 @@ format diff =
19 53
        month = 31 * day
20 54
        year = 365 * day
21 55
        roundToString = toString << ceiling
22
    in if | diff < minute -> "moments ago"
23
          | diff < hour   -> roundToString (diff / minute) ++ " minutes ago"
24
          | diff < day    -> roundToString (diff / hour)   ++ " hours ago"
25
          | diff < week   -> roundToString (diff / day)    ++ " days ago"
26
          | diff < month  -> roundToString (diff / week)   ++ " weeks ago"
27
          | diff < year   -> roundToString (diff / month)  ++ " months ago"
28
          | otherwise     -> roundToString (diff / year)   ++ " years ago"
56
        inThePast = origDiff > 0
57
        diff = abs origDiff
58
        (relativeUnit, n) =
59
            if | diff < minute -> (JustNow, 0)
60
               | diff < hour   -> (Minute, round (diff / minute))
61
               | diff < day    -> (Hour, round (diff / hour))
62
               | diff < week   -> (Day, round (diff / day))
63
               | diff < month  -> (Week, round (diff / week))
64
               | diff < year   -> (Month, round (diff / month))
65
               | otherwise     -> (Year, round (diff / year))
66
    in if inThePast
67
       then Past relativeUnit n
68
       else Future relativeUnit n