概要 - 日時の値を取得、計算する(AutoLISP)

AutoCAD 環境には、現在の図面に関連付けられている日時情報や現在のシステム日時を取得するために使用できるいくつかのシステム変数が用意されています。

現在のシステム日時の取得は、タイトル ブロックの日付フィールドに入力するときに役立ちます。一方、経過時間の計算は、プロセスの完了までに要した時間をユーザに知らせたり、カスタム プログラムの基本的な投資利益率(ROI)解析を提供する際に役立ちます。AutoCAD 環境の日時の値は実数形式で格納され、これらの値は日時をグレゴリオ歴と修正ユリウス日という 2 つの異なる形式で表します。実数の整数部(小数点の左側)は日付を表し、実数の小数部(小数点の右側)は時刻を表します。

たとえば、システム変数 CDATE が返す現在のシステム日時の例を次に示します。

20170306.15023500

20170306 = 日付: 2017 年 3 月 6 日

15023500 = 時刻: 午後 3 時 2 分 35 秒 00

注: AutoCAD 2017 ベースの製品以降、日時に関連するすべてのシステム変数は、MILLISECS を除いて、最も近い秒単位まで正確です。旧リリースの時刻には、ミリ秒も含まれていました。時間の変化を追跡する必要がある場合、0 から 999 ミリ秒が経過しても 1 秒が経過しない限り、時間の変化が表示されないことに注意が必要です。1 秒未満の経過時間を計測する必要がある場合は、システム変数 MILLISECS が返す値の使用を検討してください。

日時に関するシステム変数

このセクションでは、現在の図面に関連付けられている現在のシステム日時、または日時の値の取得に関するシステム変数を一覧表示します。

現在のシステム日付/時刻
  • CDATE - 現在の日時をコード化 10 進数形式で格納します。
  • DATE - 現在の日時が修正ユリウス日形式で格納されます。
  • MILLISECS - システムを起動してからのミリ秒単位の経過時間を表す数値が格納されます。
現在の図面に関連付けられた日付/時刻
注: これらのシステム変数が返す値は、修正ユリウス日形式です。
  • TDCREATE - 図面が作成された、地方時での日付と時刻が格納されます。
  • TDINDWG - 総編集時間、つまり現在の図面の直前の保存操作から次の保存操作までの総経過時間が格納されます。
  • TDUCREATE - 図面が作成された、世界標準時での日付と時刻が格納されます。
  • TDUPDATE - 図面が最後に更新/保存された、地方時での日付と時刻が格納されます。
  • TDUSRTIMER - 図面を開いてからの経過時間が格納されます。
  • TDUUPDATE - 図面が最後に更新または保存された、世界標準時での日付と時刻が格納されます。

日時に関するシステム変数の完全な値を表示する

GETVAR 関数を使用して実数を格納するシステム変数の値を取得する場合、コマンド プロンプトへの出力時の値は、指数表記で表示されます。指数表記によって AutoCAD プログラムで大きな 10 進数を簡単に表示できますが、読みやすく理解しやすくはなりません。RTOS 関数を使用すると、GETVAR 関数が返す実数の有効数字をすべて表示することができます。

Command: (getvar "cdate")
2.01703e+07

Command: (rtos (getvar "cdate") 2 6)
"20170306.175302"
注: RTOS 関数の 3 番目の引数は、返される実数の精度をコントロールします。値が 6 の場合、実数は小数点以下 6 桁で返されます。AutoCAD 2017 ベースの製品より前は、CDATE に格納された値にはミリ秒が含まれており、小数点以下 7 桁目と 8 桁目で表されていました。

CDATE が返す日時の値を書式設定する

CDATE に格納される実数は、コード化された十進形式で現在のシステム日時を表します。この実数を文字列に変換すると、特定の桁を簡単に抽出することができます。SUBSTR 関数を使用すると、文字列の一部を返すことができます。

Command: (setq cdate_val (rtos (getvar "cdate") 2 6))
"20170306.175302"

Command: (substr cdate_val 1 4)
"2017"

各桁の意味は、次のとおりです。

次のサンプル コードは、CDATE が返す値の異なる日付と時刻の部分を抽出するために使用できる関数の例を示しています。

; Returns or outputs the current date and time
; bOutput = T - Output the string to the Command prompt
; bOutput = nil - Return a string in the MM/DD/YYYY  HH:MM:SS format
; Usage: (CurDate T)
; Usage: (CurDate nil)

(defun CurDate (bOuput / cdate_val YYYY M D HH MM SS)
  ; Get the current date/time
  (setq cdate_val (rtos (getvar "CDATE") 2 6))

  ; Break up the string into its separate date and time parts
  (setq YYYY (substr cdate_val 1 4)
        M    (substr cdate_val 5 2)
        D    (substr cdate_val 7 2)
        HH   (substr cdate_val 10 2)
        MM   (substr cdate_val 12 2)
        SS   (substr cdate_val 14 2)
  )

  ; Output the current date and time to the Command
  ; prompt or return the formatted output as a string
  (if bOuput
    (progn
      (prompt (strcat "\nDate: " M "/" D "/" YYYY
                      "\nTime: " HH ":" MM ":" SS
              )
      )
      (princ)
    )
    (strcat M "/" D "/" YYYY "  " HH ":" MM ":" SS)
  )
)

CurDate 関数の出力または戻り値は、次のようになります。

(CurDate T)
Date: 02/14/2017
Time: 14:38:57

(CurDate nil)
"02/14/2017  14:39:04"

修正ユリウス日の値を書式設定する

CDATE と MILLISECS 以外のすべての日時関連のシステム変数は、日時を修正ユリウス日形式で格納します。修正ユリウス日形式の日付部分は数値の整数部(小数点の左側)で、紀元前 4713 年 1 月 1 日正午からの日数を表します。一方、時刻は数値の小数部(小数点の右側)で、小数部に 86,400 を掛けて計算した値が、午前 0 時からの経過時間を表します。

修正ユリウス日形式の値をより意味のある形式に変換するための計算は複雑かもしれませんが、Express Tools には日時に関する 5 つの便利な AutoLISP 関数が用意されています。日時に関する関数は、Julian.lsp ファイルが AutoCAD 環境にロードされた後にのみ使用でき、DATE コマンドまたは AutoLISP の LOAD 関数を使用してロードすることができます。

Julian.lsp ファイルがロードされた後に使用できる日時に関する AutoLISP 関数は次のとおりです。

JTOCJTOD 関数の例を次に示します。

Command: (jtoc (getvar "date"))
(2017 2 22 9 21 27.0)

Command: (rtos (jtod (getvar "date")) 2 6)
"20170222.092127"

経過時間を計算する

経過時間の計算は、2 つの異なる日時の値、または単に時刻のみの値を減算して行うことができます。必要な精度に基づいて、システム変数 CDATE または MILLISECS に格納されている値を使用することができます。時間の変化が 1 秒未満と非常に小さい場合は、システム変数 MILLISECS に格納されている値が最適です。

Command: (setq start (getvar "MILLISECS"))
25494432

Command: (setq end (getvar "MILLISECS"))
25499471

Command: (- end start)
5039

次のサンプル コードは、異なる開始時間と終了時間を表す 2 つの値の差を、ミリ秒単位で取得するために使用できる関数の例を示しています。

; Takes two values that represent milliseconds and returns
; the difference as an integer/long or double/float
;
; bMilliseconds = T   - Return value as milliseconds
; bMilliseconds = nil - Return value as seconds
;
; Usage: (TimeDiff T1 T2 T) - Milliseconds example
; Usage: (TimeDiff T1 T2 nil) - Seconds example

(defun TimeDiff (nStart nEnd bReturnMilliseconds / nDiff)
  
  ; Get the time difference
  (if (> nStart nEnd)
    (setq nDiff (- nStart nEnd))
    (setq nDiff (- nEnd nStart))
  )

  ; Return the time difference in milliseconds or seconds
  (if (= bReturnMilliseconds nil)
    (/ nDiff 1000.0)
    nDiff
  )
)

TimeDiff 関数の戻り値は、次のようになります。

(setq T1 24092498)
(setq T2 24188267)
(TimeDiff T1 T2 T)
95769

(TimeDiff T1 T2 nil)
95.769