2016-07-27 8 views
1

私は日付と時刻を「2016-09-08」と「3:45 PM」と入力しています。 clojure関数を使用して2016 09 08 3 45日時を組み合わせて瞬間を返す

私は特殊文字を削除して結合するためにreplace関数を使用しました。しかし、それは整数ではない文字列になります。私はフォーマッタ機能を使用しようとしましたが動作しませんでした。

私を助けてくれますか?

+0

https://github.com/clj-time/clj-time – jmargolisvt

答えて

5

Clojureには「標準ライブラリ」の日付/時刻解析がありませんが、いくつかのオプションがあります。最も一般的な日付/時刻ライブラリはclj-timeで、これはJoda Time(非常によく使用されているJavaライブラリ)のラッパーです。 免責事項:私は現在のclj時代のメンテナーの一人ですが、私が関与する以前は、普及して成熟した図書館でした。

はあなたproject.clj(またはbuild.boot)ファイルに依存関係としてCLJ-時間を追加し、あなたが強要やフォーマット名前空間を必要とする必要があります:

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

あなたが必要となります一緒に置くときにあなたの日付と時間の文字列の構文にマッチする "フォーマッタ"を作成する。日付部分はまっすぐですが(yyyy-MM-dd)、時間部分のAM/PM部分を解析したいので、そこに12時間の時計を記述する必要があります(KK:mm aa) :

(def my-date-time (str "2016-09-08" " " "3:45 PM")) 
(def my-formatter (tf/formatter "yyyy-MM-dd KK:mm aa")) 

今、あなたは(UTC)でジョダのDateTimeにあなたの文字列を解析して、Clojureの中にリテラルの瞬間を生成するJavaの日付に変換することができます:

(tc/to-date (tf/parse my-formatter my-date-time)) 
;=> #inst "2016-09-08T15:45:00.000-00:00" 

あなたもこれを行うことができますJava標準ライブラリSimpleDateFormatおよびTimeZoneクラスを使用して、Java interop経由で直接接続します。

(def sdf (java.text.SimpleDateFormat. "yyyy-MM-dd KK:mm aa")) 
(.setTimeZone sdf (java.util.TimeZone/getTimeZone "UTC")) 
(.parse sdf my-date-time) 
;=> #inst "2016-09-08T15:45:00.000-00:00" 

clj-timeを使用すると、一般的にははるかに慣用的なClojureが生成されます。たとえば、上記のJavaコードでは、変更可能なSimpleDateFormatオブジェクトを作成し、voidを返すメソッドを使用してタイムゾーンをUTCに変更する必要があります。それとも、このようDOTOとJavaの相互運用機能に依存している:

を解析およびフォーマットに加えて
(.parse (doto (java.text.SimpleDateFormat. "yyyy-MM-dd KK:mm aa") 
       (.setTimeZone (java.util.TimeZone/getTimeZone "UTC"))) 
     my-date-time) 
;=> #inst "2016-09-08T15:45:00.000-00:00" 

、CLJ時ライブラリは、同様の豊富なライブラリを提供し、いくつかの日付/時間関連の型へ/からの変換を提供日付/時刻の算術と比較、現地日時とUTCのサポート

+0

詳細なソリューションをありがとうございました!それはとても役に立ちました!私はClojureに関する質問をする可能性が最も高くなります。可能であれば、あなたに依頼していきたいと思います! – Kwakiekwak

+0

私ができる限り、Clojureを手伝ってうれしい! –