我有一个时间字符串"2017-08-30 09:01:48"
。有没有办法将时间缩短到最近的小时并返回小时?
因此,如果时间为"2017-08-30 09:01:48"
,则会返回9
如果时间为"2017-08-30 09:51:48"
,则会返回10
我查看了图书馆clj-time
,但我看不到任何可以帮助我的内容
非常感谢任何帮助?
答案 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)
有几种舍入方法(roundCeilingCopy
,roundHalfFloorCopy
等)可供选择,具体取决于您的具体情况。
另请注意,您不需要指定格式化程序,因为您的日期字符串已经是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
)