Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure-仅从时间字符串获取小时数_Clojure - Fatal编程技术网

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允许您使用自定义日期格式。创建一个格式化程序,并将其和字符串传递给解析函数。向下滚动到提到格式化程序的位置。