yxp 发表于 2022-2-15 21:48:08

回复 日期格式的转换

本帖最后由 yxp 于 2022-2-15 21:49 编辑

关于 wgij007 发帖日期格式转换,我记得看过一个 API 函数,流氓兔回帖我又查了一下函数,发现用 API 是比较简单的。

微软 MSDN 上查询日期格式注释如下:; d   以数字表示的月份中的日期,对于个位数的日期没有前导零。
; dd    以数字表示的月份中的日期,对于个位数的日期,前导零。
; ddd   星期几作为三个字母的缩写。
; dddd星期的全称。
; M   月份为数字,单位数月份没有前导零。
; MM    对于个位数月份,月份为前导零的数字。
; MMM   月份作为三个字母的缩写。
; MMMM月份作为它的全名。
; y   年份作为最后两位数,小于 10 的年份以零开头。格式与“yy”相同。
; yy    年份作为最后两位数,小于 10 的年份以零开头。
; yyyy用完整的四位数字表示的年份。
; gg    时期/时代字符串。

GetDateFormat 函数的第一个参数是区域码,在 https://docs.microsoft.com/en-us ... s/embedded/ms921461(v=msdn.10) 上查到,美国编码是0x0409, 转换为十进制是 1033。不用区域码直接用 0 响应是系统默认区域,中文系统 MMMM 转为月份的格式是 '八月' 字样。其他没有啥特殊参数。
下面将程序来源和注释如下:

;;Lisp 调用 API 转换时间格式
;;API 函数参考
;;https://docs.microsoft.com/en-us ... s/embedded/ms919294(v=msdn.10)
(vl-load-com)

(defun c:cvdate ()
;; 创建 DWX 对象,并注册日期和时间转换的 API 函数
(setq DWX (vlax-create-object "DynamicWrapperX"))
(vlax-invoke DWX 'Register "kernel32" "GetDateFormat" "i=uupspu" "r=l")
(vlax-invoke DWX 'Register "kernel32" "GetTimeFormat" "i=uupspu" "r=l")
(setq curtime (vlax-invoke DWX 'MemAlloc 16 1) ;;分配内存,保存时间参数
      fdate   "MMM','dd ddd yyyy" ;;格式化日期字符串
      ftime   "hh:mm:ss" ;;格式化时间字符串
      dInfo   (vlax-invoke DWX 'MemAlloc 64 1) ;; 分配内存接收转换后的日期字符串
      tInfo   (vlax-invoke DWX 'MemAlloc 64 1) ;; 分配内存接收转换后的时间字符串
      temp    (vlax-invoke DWX 'NumPut 2022 curtime "t") ;;这里是年份
      temp    (vlax-invoke DWX 'NumPut 2 temp "t") ;;月份
         ;;下面要输入星期几,但是不好计算,可以随便输入一个,函数将自动修正为正确值
      temp    (vlax-invoke DWX 'NumPut 1 temp "t")
      temp    (vlax-invoke DWX 'NumPut 15 temp "t") ;;日期
      temp    (vlax-invoke DWX 'NumPut 21 temp "t") ;;小时
      temp    (vlax-invoke DWX 'NumPut 27 temp "t") ;;分钟
      temp    (vlax-invoke DWX 'NumPut 53 temp "t") ;;秒
)
;; 以下参数 1033 是英文月份,如需中文设置为 0
(vlax-invoke DWX 'GetDateFormat 1033 0 curtime fdate dInfo 64)
;; 以下参数 8 的意思是 24 小时制,改为 0 则为 12 小时制
(vlax-invoke DWX 'GetTimeFormat 0 8 curtime ftime tInfo 64)
(setq fd (vlax-invoke DWX 'StrGet dInfo "s")
      ft (vlax-invoke DWX 'StrGet tInfo "s")
      dt (strcat fd " " ft)
)
(princ dt)
(princ)
)

; 日期格式化
; d   以数字表示的月份中的日期,对于个位数的日期没有前导零。
; dd    以数字表示的月份中的日期,对于个位数的日期,前导零。
; ddd   星期几作为三个字母的缩写。
; dddd星期的全称。
; M   月份为数字,单位数月份没有前导零。
; MM    对于个位数月份,月份为前导零的数字。
; MMM   月份作为三个字母的缩写。
; MMMM月份作为它的全名。
; y   年份作为最后两位数,小于 10 的年份以零开头。格式与“yy”相同。
; yy    年份作为最后两位数,小于 10 的年份以零开头。
; yyyy用完整的四位数字表示的年份。
; gg    时期/时代字符串。
; 区域码查询地址:
; https://docs.microsoft.com/en-us ... s/embedded/ms921461(v=msdn.10)
; 0x0409 = 1033




yxp 发表于 2022-2-15 22:02:47

明经论坛会自动修改帖子里的网站链接,源码注释中有函数说明链接,可下载查看

baitang36 发表于 2022-8-6 17:37:53

做个记号备用
页: [1]
查看完整版本: 回复 日期格式的转换