gimp方案用前导零格式化结果



我正在尝试获取文件名的时间戳。我使用给出当前时间戳的程序(时间(:

(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月1日凌晨1点左右:

(121 0 1 1 2 3)

它给出了不正确的时间戳,因为我需要前导零

202111123应为20210101010203

我想知道是否有一种比检查元素的长度并添加"0"更简单的方法;0";

Script Fu是基于Tiny Scheme的,它本身就是R5RS Scheme的一个子集。R5RS Scheme中没有内置的功能来格式化这样的数字或字符串,据我所知,也没有添加到Script Fu中,所以你需要为此创建自己的函数。

使用字符串是最容易的,而且您可能无论如何都想要字符串来为文件名添加时间戳。

这里有一个函数,用零来填充字符串。注意,结果的长度至少为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来代替cadrcaddrcadddr等。;这更容易阅读,也不容易出错。注意,list-ref对列表使用基于零的索引。

然后只需调用time-stamp就可以得到一个包含当前时间戳信息的字符串。如果您真的想从中得到一个数字,可以使用string->number,调用time-stamp的结果,或者在返回结果之前在time-stamp的定义中调用string->number

> (time-stamp)
"20201229133118"
> (string->number (time-stamp))
20201229133150

我在GIMP中运行了上面的测试,所以它显示了我当时的系统时间。下面是一个使用模拟测试的例子:

> (define (time) '(121 0 1 1 2 3))
> (time-stamp)
"20210101010203"
> (string->number (time-stamp))
20210101010203

上述time-stamp的第一个版本中存在大量代码重复。对于不熟悉Scheme编程习惯用法的人来说,这个版本可能看起来更明显,但这里有一个功能性更强的版本,它消除了很多代码重复:

(define (time-stamp)
(let* ((curr (time))
(y (+ 1900 (car curr)))
(m (+ 1 (cadr curr)))
(tstamp-nums (apply list y m (cddr curr))))
(apply string-append
(map (lambda (x) (left-pad (number->string x) 2 "0"))
tstamp-nums))))

最后我用这个做了:

(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的答案要好得多。

最新更新