インスタントと UUID
#inst と #uuid が読まれた先の値で、すべてのバックエンドで
同じように動きます。インスタントはオラクルの java.util.Date で、1970-01-01T00:00:00Z からの
ミリ秒を保持します。print でも pr でも UTC の #inst "..." と印字され、str はオラクルの
toString を UTC で返します(Wed Jan 01 00:00:00 UTC 2020)。UUID はオラクルの
java.util.UUID で、#uuid "..." と印字され、str は小文字の綴りを返します。同じ種類の 2 つの
値は、オラクルで = になるときに = です。compare はオラクルと同じ順に並べ(UUID は 2 つの
半分を符号付き long として比べます)、マップやセットは = でキーを見つけます。どちらも
コレクションでも関数でもありません。class は :java.util.Date と :java.util.UUID を返し、
class で振り分けるマルチメソッドとプロトコルはこれらのクラスでディスパッチします。
種類の判定は inst? と uuid? が行い、
clojure.instant はタイムスタンプを java.sql.Timestamp や
java.util.Calendar にも読みます。
interop の書き方も、すべてのバックエンドで同じ値を作ります。(java.util.Date.) は現在の
インスタント、(java.util.Date. ms) と (java.sql.Timestamp. ms) はそのミリ秒のインスタント、
(java.util.UUID. msb lsb) は 2 つの半分からなる UUID です。UUID/randomUUID と
UUID/fromString は random-uuid と #uuid と同じ値を返し、
System/currentTimeMillis はエポックからのミリ秒を返します。Date の getTime、setTime
(その場で書き換えます)、before、after、compareTo、Timestamp の getNanos、UUID の
2 つの半分と version、variant はどこでも答えます。インタプリタと JVM では、こうした値は
Java のメンバーにホストオブジェクトとして渡り((.format sdf (java.util.Date.)))、
そのクラスのほかのメソッドはホストオブジェクトが答えます((.toInstant d))。メンバーが
返したホストの Date や UUID は、こうした値と = になり、並べて比較できます。
| 名前 | 例 | 結果 |
|---|---|---|
inst-ms | (inst-ms #inst "1970-01-01T00:00:01Z") | 1000 |
random-uuid | (uuid? (random-uuid)) | true |
parse-uuid | (parse-uuid "1-1-1-1-1") | #uuid "00000001-0001-0001-0001-000000000001" |
java.util.Date. | (java.util.Date. 1000) | #inst "1970-01-01T00:00:01.000-00:00" |
java.util.UUID/fromString | (= (java.util.UUID/fromString "1-1-1-1-1") #uuid "1-1-1-1-1") | true |
System/currentTimeMillis | (integer? (System/currentTimeMillis)) | true |
#inst "2020-06-15T08:20:30.456-00:00" Mon Jun 15 08:20:30 UTC 2020
true (#inst "1999-01-01T00:00:00.000-00:00" #inst "2020-06-15T08:20:30.456-00:00" #inst "2021-01-01T00:00:00.000-00:00")
#uuid "550e8400-e29b-41d4-a716-446655440000" :found
違い
classは、ほかの値と同じくキーワードを返します(仕様との差異)。- インスタントの
strは、タイムゾーンを UTC としたオラクルのtoStringです。オラクルは JVM の既定のタイムゾーンで答えますが、wasm バックエンドにはタイムゾーンがありません。 - UUID の 16 進数字は ASCII の数字と英字に限ります。オラクルの
UUID.fromStringは Unicode の 10 進数字と全角ラテン文字も受け付けます。 - Java のメンバーが返したホストの
java.util.Date、java.sql.Timestamp、java.util.UUID(インタプリタと JVM)はホストオブジェクトのままです。ここで作った値とは、先に置いたほうのequalsが決めるとおりに=になり、compareToで並べて比較でき、inst?、uuid?、inst-msも受け付けます(java.time.Instantも同様です)。ただし#<java java.util.Date>と 印字され、マップのキーやセットの要素としては、ここで作った値とは別のものになります。 - 実行時に計算した文字列を渡す
(java.util.Date. s)は拒否します。オラクルが行う非推奨のDate(String)による解析はありません(リテラルの文字列なら、インタプリタと JVM では従来どおり ホストのコンストラクタに届きます)。Date のsetTime以外の変更メソッド(setYearなど)は 名前を挙げて拒否します。オラクルの Date はこれらで書き換わります。 - clojure.instant の Calendar にはホストオブジェクトがありません。Java の
メンバーには渡らず、そのクラスのメソッドは名前を挙げて拒否します。wasm では、Date や UUID の
メソッドのうちホストだけが答えるもの(
toInstant、hashCode)も同じく拒否します。