Clojure-仅从时间字符串获取小时数
我有一个时间字符串Clojure-仅从时间字符串获取小时数,clojure,Clojure,我有一个时间字符串“2017-08-30 09:01:48”。有没有办法把时间四舍五入到最近的一个小时,然后再回到这个小时 因此,如果时间是“2017-08-30 09:01:48”它将返回9 如果时间是“2017-08-30 09:51:48”它将返回10 我看了一下图书馆clj time,但里面没有任何对我有帮助的东西 如果您有任何帮助,我们将不胜感激。这对于clj时间库来说非常简单 (ns foo.hours (:require [clj-time.core :as time]
“2017-08-30 09:01:48”
。有没有办法把时间四舍五入到最近的一个小时,然后再回到这个小时
因此,如果时间是“2017-08-30 09:01:48”
它将返回9
如果时间是“2017-08-30 09:51:48”
它将返回10
我看了一下图书馆clj time
,但里面没有任何对我有帮助的东西
如果您有任何帮助,我们将不胜感激。这对于clj时间库来说非常简单
(ns foo.hours
(:require
[clj-time.core :as time]
[clj-time.format :as timef]))
(defn parse [s]
(timef/parse (timef/formatter "yyyy-MM-dd HH:mm:ss") s))
(defn round-hour [time]
(let [m (time/minute time)
h (time/hour time)
rounded-h (if (<= 30 m) (inc h) h)]
(if (= 24 rounded-h) 0 rounded-h)))
(comment
(def f (comp round-hour parse))
(f "2017-08-30 09:20:48") ;=> 9
(f "2017-08-30 09:33:48") ;=> 10
(f "2017-08-30 23:39:48") ;=> 0
)
(ns foo.hours
(:需要
[clj-time.core:as-time]
[clj-time.format:as-timef]))
(defn解析[s]
(timef/parse(timef/formatter“yyyy-MM-dd HH:MM:ss”)s)
(整小时[时间]
(让[m(时间/分钟时间)
小时(时间/小时)
四舍五入-h(如果(9
(f“2017-08-3009:33:48”);=>10
(f“2017-08-30 23:39:48”);=>0
)
clj-time
是Joda时间库的一个薄包装器。您可以轻松地使用底层Java对象的方法来执行常见的日期操作
要舍入小时,您可以访问小时作为一个,并使用其API舍入到最近的小时,如下所示:
(require '[clj-time.format :as tf])
(-> (tf/parse "2017-08-30 09:01:48")
.hourOfDay
.roundHalfCeilingCopy
.getHourOfDay)
根据具体情况,有几种舍入方法可供选择(roundCeilingCopy
,roundHalfFloorCopy
等)
另外请注意,您不需要指定格式化程序,因为您的日期字符串已经是ISO8601格式。如果您不想依赖另一个库,请不要忘记,我们在Java 8中提供了新的日期/时间API。 尽管它不支持四舍五入到最接近的小时(分钟,随便什么),但它很容易实现 代码如下:
(import 'java.time.LocalDateTime)
(import 'java.time.format.DateTimeFormatter)
(def date-format (DateTimeFormatter/ofPattern "yyyy-MM-dd HH:mm:ss"))
(defn- round-to-nearest-hour [date-time-string]
(let [date-time (LocalDateTime/parse date-time-string date-format)]
(if (>= 30 (.getMinute date-time))
date-time
(.plusHours date-time 1))))
(.getHour (round-to-nearest-hour "2017-08-30 09:01:48")) ;=> 9
(.getHour (round-to-nearest-hour "2017-08-30 09:31:48")) ;=> 10
Clj time有一个解析函数,iirc允许您使用自定义日期格式。创建一个格式化程序,并将其和字符串传递给解析函数。向下滚动到提到格式化程序的位置。