parent
bb729c6c81
commit
0f2af863e7
|
@ -32,19 +32,53 @@
|
|||
loc (get goog.i18n (str "DateTimeSymbols_" name-first))]
|
||||
(or loc goog.i18n.DateTimeSymbols_en))))
|
||||
|
||||
(def medium-date-time-format (.-MEDIUM_DATETIME goog.i18n.DateTimeFormat.Format))
|
||||
(def medium-date-format (.-MEDIUM_DATE goog.i18n.DateTimeFormat.Format))
|
||||
(def short-time-format (.-SHORT_TIME goog.i18n.DateTimeFormat.Format))
|
||||
;; detects if given locale symbols timeformat generates AM/PM ("a")
|
||||
(defn- is24Hour-locsym [locsym]
|
||||
(not (s/includes?
|
||||
(nth (get locsym 'TIMEFORMATS) 2)
|
||||
"a")))
|
||||
|
||||
(defn mk-fmt [locale format]
|
||||
(goog.i18n.DateTimeFormat. format (locale-symbols locale)))
|
||||
;; returns is24Hour from device or from given locale symbols
|
||||
;; 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
|
||||
(mk-fmt status-im.i18n/locale medium-date-time-format))
|
||||
(def date-fmt
|
||||
(mk-fmt status-im.i18n/locale medium-date-format))
|
||||
(def time-fmt
|
||||
(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]
|
||||
(let [date (from-long ms)
|
||||
|
@ -69,9 +103,9 @@
|
|||
#(label :t/datetime-today)))
|
||||
|
||||
(defn timestamp->mini-date [ms]
|
||||
(unparse (formatter "dd MMM") (-> ms
|
||||
from-long
|
||||
(plus time-zone-offset))))
|
||||
(.format short-date-fmt (-> ms
|
||||
from-long
|
||||
(plus time-zone-offset))))
|
||||
|
||||
(defn timestamp->time [ms]
|
||||
(.format time-fmt (-> ms
|
||||
|
@ -84,10 +118,9 @@
|
|||
(plus time-zone-offset)))))
|
||||
|
||||
(defn timestamp->long-date [ms]
|
||||
(keyword (unparse (formatter "MMM DD YYYY HH:mm:ss")
|
||||
(-> ms
|
||||
from-long
|
||||
(plus time-zone-offset)))))
|
||||
(.format date-time-fmt (-> ms
|
||||
from-long
|
||||
(plus time-zone-offset))))
|
||||
|
||||
(defn format-time-ago [diff unit]
|
||||
(let [name (label-pluralize diff (:name unit))]
|
||||
|
|
|
@ -21,12 +21,35 @@
|
|||
;; 1970-01-03 00:00:00 UTC
|
||||
(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
|
||||
(with-redefs [t/*ms-fn* (constantly epoch-plus-3d)
|
||||
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) "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
|
||||
(with-redefs [t/*ms-fn* (constantly epoch-plus-3d)
|
||||
d/time-zone-offset (t/period :hours 0)
|
||||
|
@ -50,3 +73,17 @@
|
|||
d/time-zone-offset (t/period :hours 0)
|
||||
d/date-fmt (d/mk-fmt "nb-NO" d/medium-date-time-format)]
|
||||
(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