parent
bb729c6c81
commit
0f2af863e7
|
@ -32,19 +32,53 @@
|
||||||
loc (get goog.i18n (str "DateTimeSymbols_" name-first))]
|
loc (get goog.i18n (str "DateTimeSymbols_" name-first))]
|
||||||
(or loc goog.i18n.DateTimeSymbols_en))))
|
(or loc goog.i18n.DateTimeSymbols_en))))
|
||||||
|
|
||||||
(def medium-date-time-format (.-MEDIUM_DATETIME goog.i18n.DateTimeFormat.Format))
|
;; detects if given locale symbols timeformat generates AM/PM ("a")
|
||||||
(def medium-date-format (.-MEDIUM_DATE goog.i18n.DateTimeFormat.Format))
|
(defn- is24Hour-locsym [locsym]
|
||||||
(def short-time-format (.-SHORT_TIME goog.i18n.DateTimeFormat.Format))
|
(not (s/includes?
|
||||||
|
(nth (get locsym 'TIMEFORMATS) 2)
|
||||||
|
"a")))
|
||||||
|
|
||||||
(defn mk-fmt [locale format]
|
;; returns is24Hour from device or from given locale symbols
|
||||||
(goog.i18n.DateTimeFormat. format (locale-symbols locale)))
|
;; when device-info module is not available (ie. desktop) returns from the given locale
|
||||||
|
;
|
||||||
|
; TODO integrate with native module. example:
|
||||||
|
; (defn- is24Hour [locsym]
|
||||||
|
; (if rn/device-info
|
||||||
|
; (.is24Hour rn/device-info)
|
||||||
|
; (is24Hour-locsym locsym)))
|
||||||
|
|
||||||
|
(defn- is24Hour [locsym]
|
||||||
|
(is24Hour-locsym locsym))
|
||||||
|
|
||||||
|
;; time formats
|
||||||
|
(defn- short-time-format [locsym] (if (is24Hour locsym) "HH:mm" "h:mm a"))
|
||||||
|
(defn- time-format [locsym] (if (is24Hour locsym) "HH:mm:ss" "h:mm:ss a"))
|
||||||
|
|
||||||
|
;; date formats
|
||||||
|
(defn- short-date-format [locsym] "dd MMM")
|
||||||
|
(defn- medium-date-format [locsym] (nth (get locsym 'DATEFORMATS) 2)) ; get medium format from current locale symbols
|
||||||
|
|
||||||
|
;; date-time formats
|
||||||
|
(defn- medium-date-time-format [locsym] (str (medium-date-format locsym) ", " (time-format locsym)))
|
||||||
|
|
||||||
|
;; get formatter for current locale symbols and format function
|
||||||
|
(defn- mk-fmt [locale format-fn]
|
||||||
|
(let [locsym (locale-symbols locale)]
|
||||||
|
(goog.i18n.DateTimeFormat. (format-fn locsym) locsym)))
|
||||||
|
|
||||||
|
;; generate formatters for different formats
|
||||||
(def date-time-fmt
|
(def date-time-fmt
|
||||||
(mk-fmt status-im.i18n/locale medium-date-time-format))
|
(mk-fmt status-im.i18n/locale medium-date-time-format))
|
||||||
(def date-fmt
|
(def date-fmt
|
||||||
(mk-fmt status-im.i18n/locale medium-date-format))
|
(mk-fmt status-im.i18n/locale medium-date-format))
|
||||||
(def time-fmt
|
(def time-fmt
|
||||||
(mk-fmt status-im.i18n/locale short-time-format))
|
(mk-fmt status-im.i18n/locale short-time-format))
|
||||||
|
(def short-date-fmt
|
||||||
|
(mk-fmt status-im.i18n/locale short-date-format))
|
||||||
|
|
||||||
|
;;
|
||||||
|
;; functions which apply formats for the given timestamp
|
||||||
|
;;
|
||||||
|
|
||||||
(defn- to-str [ms old-fmt-fn yesterday-fmt-fn today-fmt-fn]
|
(defn- to-str [ms old-fmt-fn yesterday-fmt-fn today-fmt-fn]
|
||||||
(let [date (from-long ms)
|
(let [date (from-long ms)
|
||||||
|
@ -69,9 +103,9 @@
|
||||||
#(label :t/datetime-today)))
|
#(label :t/datetime-today)))
|
||||||
|
|
||||||
(defn timestamp->mini-date [ms]
|
(defn timestamp->mini-date [ms]
|
||||||
(unparse (formatter "dd MMM") (-> ms
|
(.format short-date-fmt (-> ms
|
||||||
from-long
|
from-long
|
||||||
(plus time-zone-offset))))
|
(plus time-zone-offset))))
|
||||||
|
|
||||||
(defn timestamp->time [ms]
|
(defn timestamp->time [ms]
|
||||||
(.format time-fmt (-> ms
|
(.format time-fmt (-> ms
|
||||||
|
@ -84,10 +118,9 @@
|
||||||
(plus time-zone-offset)))))
|
(plus time-zone-offset)))))
|
||||||
|
|
||||||
(defn timestamp->long-date [ms]
|
(defn timestamp->long-date [ms]
|
||||||
(keyword (unparse (formatter "MMM DD YYYY HH:mm:ss")
|
(.format date-time-fmt (-> ms
|
||||||
(-> ms
|
from-long
|
||||||
from-long
|
(plus time-zone-offset))))
|
||||||
(plus time-zone-offset)))))
|
|
||||||
|
|
||||||
(defn format-time-ago [diff unit]
|
(defn format-time-ago [diff unit]
|
||||||
(let [name (label-pluralize diff (:name unit))]
|
(let [name (label-pluralize diff (:name unit))]
|
||||||
|
|
|
@ -21,12 +21,35 @@
|
||||||
;; 1970-01-03 00:00:00 UTC
|
;; 1970-01-03 00:00:00 UTC
|
||||||
(def epoch-plus-3d 172800000)
|
(def epoch-plus-3d 172800000)
|
||||||
|
|
||||||
|
(deftest is24Hour-locale-en-test
|
||||||
|
(is (= (d/is24Hour-locsym (d/locale-symbols "en")) false)))
|
||||||
|
|
||||||
|
(deftest is24Hour-locale-it-test
|
||||||
|
(is (= (d/is24Hour-locsym (d/locale-symbols "it")) true)))
|
||||||
|
|
||||||
|
(deftest is24Hour-locale-nb-test
|
||||||
|
(is (= (d/is24Hour-locsym (d/locale-symbols "nb-NO")) true)))
|
||||||
|
|
||||||
(deftest to-short-str-today-test
|
(deftest to-short-str-today-test
|
||||||
(with-redefs [t/*ms-fn* (constantly epoch-plus-3d)
|
(with-redefs [t/*ms-fn* (constantly epoch-plus-3d)
|
||||||
d/time-fmt (d/mk-fmt "us" d/short-time-format)
|
d/time-fmt (d/mk-fmt "us" d/short-time-format)
|
||||||
d/time-zone-offset (t/period :hours 0)]
|
d/time-zone-offset (t/period :hours 0)]
|
||||||
(is (= (d/to-short-str epoch-plus-3d) "12:00 AM"))))
|
(is (= (d/to-short-str epoch-plus-3d) "12:00 AM"))))
|
||||||
|
|
||||||
|
(deftest to-short-str-today-force-24H-test
|
||||||
|
(with-redefs [t/*ms-fn* (constantly epoch-plus-3d)
|
||||||
|
d/is24Hour (constantly true)
|
||||||
|
d/time-fmt (d/mk-fmt "us" d/short-time-format)
|
||||||
|
d/time-zone-offset (t/period :hours 0)]
|
||||||
|
(is (= (d/to-short-str epoch-plus-3d) "00:00"))))
|
||||||
|
|
||||||
|
(deftest to-short-str-today-force-AMPM-test
|
||||||
|
(with-redefs [t/*ms-fn* (constantly epoch-plus-3d)
|
||||||
|
d/is24Hour (constantly false)
|
||||||
|
d/time-fmt (d/mk-fmt "it" d/short-time-format)
|
||||||
|
d/time-zone-offset (t/period :hours 0)]
|
||||||
|
(is (= (d/to-short-str epoch-plus-3d) "12:00 AM"))))
|
||||||
|
|
||||||
(deftest to-short-str-before-yesterday-us-test
|
(deftest to-short-str-before-yesterday-us-test
|
||||||
(with-redefs [t/*ms-fn* (constantly epoch-plus-3d)
|
(with-redefs [t/*ms-fn* (constantly epoch-plus-3d)
|
||||||
d/time-zone-offset (t/period :hours 0)
|
d/time-zone-offset (t/period :hours 0)
|
||||||
|
@ -50,3 +73,17 @@
|
||||||
d/time-zone-offset (t/period :hours 0)
|
d/time-zone-offset (t/period :hours 0)
|
||||||
d/date-fmt (d/mk-fmt "nb-NO" d/medium-date-time-format)]
|
d/date-fmt (d/mk-fmt "nb-NO" d/medium-date-time-format)]
|
||||||
(is (= (d/day-relative epoch) "1. jan. 1970, 00:00:00"))))
|
(is (= (d/day-relative epoch) "1. jan. 1970, 00:00:00"))))
|
||||||
|
|
||||||
|
(deftest day-relative-before-yesterday-force-24H-test
|
||||||
|
(with-redefs [t/*ms-fn* (constantly epoch-plus-3d)
|
||||||
|
d/is24Hour (constantly true)
|
||||||
|
d/time-zone-offset (t/period :hours 0)
|
||||||
|
d/date-fmt (d/mk-fmt "us" d/medium-date-time-format)]
|
||||||
|
(is (= (d/day-relative epoch) "Jan 1, 1970, 00:00:00"))))
|
||||||
|
|
||||||
|
(deftest day-relative-before-yesterday-force-AMPM-test
|
||||||
|
(with-redefs [t/*ms-fn* (constantly epoch-plus-3d)
|
||||||
|
d/is24Hour (constantly false)
|
||||||
|
d/time-zone-offset (t/period :hours 0)
|
||||||
|
d/date-fmt (d/mk-fmt "it" d/medium-date-time-format)]
|
||||||
|
(is (= (d/day-relative epoch) "01 gen 1970, 12:00:00 AM"))))
|
Loading…
Reference in New Issue