torutkのブログ

ソフトウェア・エンジニアのブログ

JDK 9のjshellで締め切りまであと何時間かを調べる

JDK 9には、対話型環境(REPL環境と呼ばれる)を提供するjshellコマンドが追加されます。
JDK 9 Releasesで試してみます。

Windows OSでは、コマンドプロンプトを開き、JDK 9のコマンド類が格納されているフォルダを環境変数PATHに追加します。
そして、jshellコマンドを実行すると、対話型環境のプロンプトが表示されます。

C:\Users\toru>jshell
|  JShellへようこそ -- バージョン9-ea
|  概要については、次を入力してください: /help intro

jshell>

java.time.LocalDateTimeクラスで今の日時を取得しようと、適当に入力すると、エラーになってしまいます。

jshell> now = LocalDateTime.now();
|  エラー:
|  シンボルを見つけられません
|    シンボル:   変数 now
|    場所: クラス
|  now = LocalDateTime.now();
|  ^-^
|  エラー:
|  シンボルを見つけられません
|    シンボル:   変数 LocalDateTime
|    場所: クラス
|  now = LocalDateTime.now();
|        ^-----------^

jshell>

型宣言なしの変数は受け付けてくれませんでした。Javaの文法にちゃんと従わないとダメなようです。

次に、インポート文なしでLocalDateTimeを使うと認識してくれませんでした。これもJavaの文法通りですね。ちなみに、インポートの一覧は、/importsコマンドで確認できます。デフォルトでは次のimportが有効です。

jshell> /imports
|    import java.util.*
|    import java.io.*
|    import java.math.*
|    import java.net.*
|    import java.util.concurrent.*
|    import java.util.prefs.*
|    import java.util.regex.*

jshell>

では、java.time.*をインポートしてみましょう。

jshell> import java.time.*

jshell> /imports
|    import java.util.*
|    import java.io.*
|    import java.math.*
|    import java.net.*
|    import java.util.concurrent.*
|    import java.util.prefs.*
|    import java.util.regex.*
|    import java.time.*

jshell>

インポートが認識されました。

では、現在の日時を取得してみます。と、その前に、コマンドラインの補完を見てみましょう。

Lo と2文字を入れた直後にTABキーを押します。

jshell> Lo
LocalDate               LocalDateTime           LocalTime
Locale                  Logger                  Long
LongSummaryStatistics

jshell>

と、補完候補が表示されます。

Localまで入れてTABキーを押すと、

jshell> Local
LocalDate       LocalDateTime   LocalTime       Locale

jshell>

と絞り込まれました。

LocalDと入れてTABキーを押すと、LocalDate と補完されます。補完されたLocalDateに続いてTを入れ、さらにTABキーを押すとLocalDateTimeに補完されます。UNIXのシェル環境程度には補完が効くようです。

では、今の日時を取得します。

jshell> LocalDateTime now = LocalDateTime.now()
now ==> 2016-09-09T18:23:19.990769100

jshell>

おー、文が実行され、この場合左辺の変数の内容が表示されました。

次に、締め切り日時を作成します。

jshell> LocalDateTime due = LocalDateTime.of(2016, 9, 11, 23, 59, 59)
due ==> 2016-09-11T23:59:59

jshell>

ここで、今の日時と締め切り日時が変数に取れたので、この2つの日時の間を算出します。

jshell> Duration remain = Duration.between(now, due)
remain ==> PT53H36M39.0092309S

jshell>

ということで、Java読書会BOF の次回課題図書投票締め切りまではあと53時間ちょっと、ということになります。

追記

  • 補完はクラス名だけでなく、メソッド名も対象となります。
  • printfはSystem.out.printfとせずに単独で使えます。printlnはだめだけど。
jshell> /methods
|    printf (String,Object...)void

jshell>

と、デフォルトで裸で使えるメソッドとして登録されています。