我发现在常见的lisp中没有像Java SimpleDateFormat这样强大的工具。
理解SimpleDateFormat的原理对我来说太难了,所以我只能自己写了。我写了一个‘日期格式化’的函数,但我认为它太难看了,而且存在一些bug。
你能解释一下SimpleDateFormat是如何实现或提供强大功能的吗?
(defparameter *pattern-char* "yMdhHmsS")函数DATE-FORMATTER:
(defun date-formatter (pattern str)
(let ((year nil)
(month nil)
(day nil)
(hour nil)
(minite nil)
(second nil)
(index nil))
(do* ((index 0 (+ 1 index))
(c (subseq *pattern-char* index (+ 1 index))
(subseq *pattern-char* index (1+ index)))
(p (concatenate 'string c "+")
(concatenate 'string c "+"))
(m (cl-ppcre:scan-to-strings p pattern)
(cl-ppcre:scan-to-strings p pattern)))
((= index (1- (length *pattern-char*))))
(if m
(let* ((i (subseq str (search m pattern)
(+ (length m) (search m pattern)))))
(cond ((< 0 (length (cl-ppcre:scan-to-strings "y+" m)))
(setf year (parse-integer i)))
((< 0 (length (cl-ppcre:scan-to-strings "M*" m)))
(setf month (parse-integer i)))
((< 0 (length (cl-ppcre:scan-to-strings "d*" m)))
(setf day (parse-integer i)))
((< 0 (length (cl-ppcre:scan-to-strings "H*" m)))
(setf hour (parse-integer i)))
((< 0 (length (cl-ppcre:scan-to-strings "m*" m)))
(setf minite (parse-integer i)))
((< 0 (length (cl-ppcre:scan-to-strings "s*" m)))
(setf second (parse-integer i)))
(t (print "error!!"))))))
(values year month day hour minite second))) 示例:
(declaim (optimize (speed 0) (safety 3) (debug 3)))
(defun f ()
(multiple-value-bind (year month day hour minute second)
(date-formatter "yyyy-MM-dd HH:mm:ss" "2013-05-12 23:22:11")
(list year month day hour minute second )))发布于 2013-08-23 14:27:40
local-time是一个用于日期和时间的库,文档是here,两个月前还在积极开发。
你可以通过在你的lisp shell中输入(ql:quickload :local-time)并点击return来安装它(假设你已经安装了quicklisp )
这是谷歌搜索"common lisp date and time“中的第三个结果,第一个是this link to the common lisp cookbook page on dates & times
希望他们能帮上忙!
编辑
更多信息!这个库非常酷,所以我想我应该把这个补充物贴出来:
local-time:parse-timestring很好,因为您可以精确地指定日期时间字符串的布局方式。默认情况下,它期望日期分隔符是#-,时间分隔符是#\:,这两个都是正确的(记住#\是用来指定字符的),但是我必须将日期-时间-分隔符设置为#\space,因为我的输入在日期和时间之间有一个空格。请看下面的!
CL-USER> (local-time:parse-timestring "2013-01-23 12:12:12" :date-time-separator #\space)
@2013-01-23T12:12:12.000000Zhttps://stackoverflow.com/questions/18394356
复制相似问题