2017-09-12 4 views
3

시간 문자열이 "2017-08-30 09:01:48"입니다. 시간을 가장 가까운 시간으로 반올림하고 시간을 반환하는 방법이 있습니까? 시간이 "2017-08-30 09:01:48" 인 경우 시간이 "2017-08-30 09:51:48"라면Clojure - 시간 문자열에서만 시간 받기

그래서 그것이 10

을 반환 9

을 반환 나는 도서관 clj-time 보았다하지만 그 날 도움이 될 거기에 난 아무것도 볼 수 없었다

어떤 도움을 주시면 감사하겠습니다.

+0

CLJ-시간, IIRC, 사용자 정의 날짜 형식을 사용할 수있는 분석 기능을 가지고 있습니다. 포맷터를 생성하고 문자열을 파싱 함수에 전달하십시오. – Carcigenicate

+0

https://github.com/clj-time/clj-time/blob/master/README.md 포매터를 언급하는 곳으로 스크롤하십시오. – Carcigenicate

답변

6

clj-time은 Joda Time 라이브러리의 씬 래퍼입니다. 기본 Java 객체의 메소드를 쉽게 사용하여 일반적인 날짜 조작을 수행 할 수 있습니다. 다음과 같이

는 시간을 반올림를 들어, DateTime.Property로 시간을 액세스 할 수있는 가장 가까운 시간에 라운드에 자사의 API를 사용하는 (등 roundCeilingCopy, roundHalfFloorCopy) 여러 반올림 방법이 있습니다

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

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

정확한 경우에 따라 선택하십시오.

날짜 문자열이 이미 ISO8601 형식이므로 형식 지정자를 지정할 필요가 없습니다.

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 

) 
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