Clojure - 仅从时间字符串中获取小时数

时间:2017-09-12 13:58:47

标签: clojure

我有一个时间字符串"2017-08-30 09:01:48"。有没有办法将时间缩短到最近的小时并返回小时?

因此,如果时间为"2017-08-30 09:01:48",则会返回9

如果时间为"2017-08-30 09:51:48",则会返回10

我查看了图书馆clj-time,但我看不到任何可以帮助我的内容

非常感谢任何帮助?

3 个答案:

答案 0 :(得分:6)

clj-time是Joda Time库的瘦包装器。您可以轻松使用底层Java对象的方法来执行常见的日期操作。

对于四舍五入的小时,您可以DateTime.Property访问小时,并使用其API来舍入到最近的小时,如下所示:

(require '[clj-time.format :as tf])

(-> (tf/parse "2017-08-30 09:01:48")
    .hourOfDay
    .roundHalfCeilingCopy
    .getHourOfDay)

有几种舍入方法(roundCeilingCopyroundHalfFloorCopy等)可供选择,具体取决于您的具体情况。

另请注意,您不需要指定格式化程序,因为您的日期字符串已经是ISO8601格式。

答案 1 :(得分:3)

如果您不想依赖其他库,请不要忘记,我们在Java 8中有新的日期/时间API。 虽然它不支持舍入到最近的小时(分钟,无论如何),但这很容易实现,如madstap in his solution

以下是代码:

(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

答案 2 :(得分:2)

使用clj-time库非常简单。

(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

  )