问题描述
我正在尝试获取文件名的时间戳。 我使用提供当前时间戳的过程(时间):
(120 11 29 17 32 25)
年-1900 月-1 天时分秒
(+ 1900 (car (time)) )(+ 1 (cadr (time)))(caddr(time))(cadddr(time))(cadr(cdddr(time)))(caddr(cdddr(time)))
这几乎是好的,但是...如果任何元素小于 10(例如,一月一日大约凌晨 1 点:
(121 0 1 1 2 3)
它给出了不正确的时间戳,因为我需要前导零
202111123
应该是 20210101010203
解决方法
Script-Fu 基于 Tiny Scheme,它本身是 R5RS Scheme 的子集。 R5RS Scheme 中没有内置功能来格式化数字或字符串,据我所知,也没有添加到 Script-Fu 中,因此您需要为此创建自己的函数。
使用字符串是最容易的,而且您可能想要字符串来为文件名添加时间戳。
这是一个用零左填充字符串的函数。请注意,结果的长度至少为 Marshal.PtrToStringUni
个字符,但如果输入的 width
已经长于 str
,则不会对其进行修剪:
width
您可以在返回所需格式字符串的 (define (left-pad str width pad)
(let add-padding ((s str))
(if (< (- width (string-length s)) 1)
s
(add-padding (string-append pad s)))))
函数中使用此函数:
time-stamp
这里用(define (time-stamp)
(let* ((curr (time))
(year (number->string (+ 1900 (list-ref curr 0))))
(month (left-pad (number->string (+ 1 (list-ref curr 1))) 2 "0"))
(day (left-pad (number->string (list-ref curr 2)) 2 "0"))
(hour (left-pad (number->string (list-ref curr 3)) 2 "0"))
(minute (left-pad (number->string (list-ref curr 4)) 2 "0"))
(second (left-pad (number->string (list-ref curr 5)) 2 "0")))
(string-append year month day hour minute second)))
代替list-ref
、cadr
、caddr
等;这更易于阅读且不易出错。请注意,list-ref
在列表中使用从零开始的索引。
然后只需调用 cadddr
即可获取包含当前时间戳信息的字符串。如果你真的想要一个数字,你可以使用 time-stamp
,或者调用 string->number
的结果,或者在返回结果之前调用 time-stamp
定义中的 string->number
:
time-stamp
我在 GIMP 中运行了上面的测试,所以它显示了我当时的系统时间。以下是使用模拟测试的示例:
> (time-stamp)
"20201229133118"
> (string->number (time-stamp))
20201229133150
上面> (define (time) '(121 0 1 1 2 3))
> (time-stamp)
"20210101010203"
> (string->number (time-stamp))
20210101010203
的第一个版本中有很多代码重复。对于不熟悉 Scheme 编程习惯用法的人来说,该版本可能看起来更明显,但这里有一个功能性更强的版本,删除了大量重复代码:
time-stamp
,
最后我做到了:
(define year (+ 1900 (car (time))))
(define month (+ 1 (cadr (time))))
(define day (caddr(time)))
(define hour (cadddr(time)))
(define minute (cadr(cdddr(time))))
(define second (caddr(cdddr(time))))
(set! newFileName (string-append inDir pathchar inFileName
(number->string year)
(if (< month 10) (string-append "0" (number->string month)) (number->string month))
(if (< day 10) (string-append "0" (number->string day)) (number->string day))
(if (< hour 10) (string-append "0" (number->string hour)) (number->string hour))
(if (< minute 10) (string-append "0" (number->string minute)) (number->string minute))
(if (< second 10) (string-append "0" (number->string second)) (number->string second))
saveString))
但我认为@ad absurdum 的答案要好得多。