CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

AutoCAD 2021 开发者帮助

关于获取和计算日期\时间值 (AutoLISP)

2024-5-18 18:28| 发布者: admin| 查看: 16| 评论: 0|原作者: admin|来自: AutoCAD

关于获取和计算日期\时间值 (AutoLISP)

AutoCAD环境提供了多个系统变量,这些变量可用于获取当前系统日期\时间以及有关当前图形的日期\时间相关信息。

在标题栏中填充日期字段时,获取当前系统日期\时间可能很有帮助,而当您想让用户知道完成流程所需的时间或为自定义程序提供基本的投资回报率 (ROI) 分析时,计算经过的时间可能会有所帮助。AutoCAD 环境中的日期\时间值存储为实数,这些值以两种不同的格式表示日期\时间;公历和修改后的儒略日期。实数的整数部分(小数点左边)表示日期,而实数的小数部分(小数点右边的部分)表示时间。

例如,以下是 CDATE 系统变量返回的当前系统日期\时间的示例:

20170306.15023500

20170306 = 日期:03/06/2017

15023500 = 时间:下午 3:02:25:00

注意:从基于 AutoCAD 2017 的产品开始,所有与日期\时间相关的系统变量仅精确到最接近的秒,但 MILLISECS 除外;而在以前的版本中,时间也包括毫秒。如果您需要跟踪时间变化,请注意,即使可能已经过去了 0 到 999 毫秒,在经过一秒之前,您不会再看到时间变化。当需要计算小于 1 秒的时间差异时,请考虑使用 MILLISECS 系统变量返回的值。

日期\时间相关系统变量

本节列出了与获取与当前图形关联的当前系统日期\时间或日期\时间值相关的系统变量。

当前系统
  • CDATE - 以编码的十进制格式存储当前日期和时间。
  • DATE - 以修改后的儒略日期格式存储当前日期和时间。
  • 毫秒 - 存储自系统启动以来经过的毫秒数。
与当前图形关联
注意:这些系统变量返回的值采用修改后的儒略日期格式。
  • TDCREATE - 存储图形创建的本地时间和日期。
  • TDINDWG - 存储总编辑时间,即当前图形保存之间的总运行时间。
  • TDUCREATE - 存储创建图形的通用时间和日期。
  • TDUPDATE - 存储上次更新/保存的本地时间和日期。
  • TDUSRTIMER - 存储用户经过的计时器。
  • TDUUPDATE - 存储上次更新或保存的通用时间和日期。

显示与日期\时间相关的系统变量的完整值

使用该函数获取存储实数的系统变量的值时,输出到命令提示符时的值以科学记数法显示。虽然科学记数法使 AutoCAD 程序更容易显示大十进制数,但它并不能使其更易于阅读或理解。该函数可用于显示函数返回的实数的所有有效数字。GETVARRTOSGETVAR

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

Command: (rtos (getvar "cdate") 2 6)
"20170306.175302"
注意:该函数的第三个参数控制返回实数的精度。值 6 表示应在小数点后返回 6 位有效数字的实数。在基于 AutoCAD 2017 的产品之前,存储在 CDATE 中的值包括毫秒,毫秒由小数点后第 7 位和第 8 位有效数字表示。RTOS

设置 CDATE 返回的 date\Time 值的格式

存储在CDATE中的实数以编码的十进制格式表示当前系统日期和时间;将该实数转换为字符串可以更轻松地提取特定数字。使用该函数,可以返回字符串的一部分。SUBSTR

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

Command: (substr cdate_val 1 4)
"2017"

下面分解了每个数字的含义:

  • 1-4:年份
  • 5-6:月
  • 7-8:天
  • 10-11:营业时间
  • 12-13:分钟
  • 14-15:秒
  • 16-17:毫秒(仅限基于 AutoCAD 2016 的产品及更早版本)

以下示例代码显示了一个函数的示例,您可以使用该函数提取 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。

将修改后的儒略日期格式的值转换为更有意义的值所需的计算可能很复杂,但 Express Tools 中有五个与日期\时间相关的 AutoLISP 函数可能会有所帮助。日期\时间相关功能仅在将 Julian.lsp 文件加载到 AutoCAD 环境中后才可用,这可以通过使用 DATE 命令或 AutoLISP 函数来完成。LOAD

以下是加载 Julian.lsp 文件后可用的与日期\时间相关的 AutoLISP 函数:

  • CTOJ- 将日历日期和时间转换为儒略日期
  • DTOJ- 将AutoCAD日历日期/时间转换为儒略日期
  • JTOC- 将儒略日期转换为日历日期列表
  • JTOD- 将儒略日期转换为AutoCAD日历日期/时间
  • JTOW- 确定给定儒略日一周中的某一天

以下是 和 函数的示例:JTOCJTOD

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

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

计算运行时间

可以通过减去两个不同的日期和时间,或者仅减去时间值来计算经过的时间。根据所需的精度,您可以使用存储在 CDATE 或 MILLISECS 系统变量中的值。对于非常小的时间变化(几分之一秒),存储在 MILLISECS 系统变量中的值是最好的。

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

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

Command: (- end start)
5039

以下示例代码显示了一个函数示例,该函数可用于获取表示不同开始和结束时间(以毫秒为单位)的两个值之间的差异:

; 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

路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 )

GMT+8, 2024-6-27 16:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部