我發現在通用lisp中沒有像Java SimpleDateFormat
這樣的強大工具。在Java中使用Common Lisp創建像SimpleDateFormat這樣的函數
這對我來說太難了解SimpleDateFormat
的原理,所以我必須自己編寫 。我寫了一個函數'date-formatter',但我認爲這太難看了,並且存在一些錯誤。
你能解釋一下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)))
你必須對你的問題更具體。這裏有什麼問題,哪些不起作用? –
這不是日期格式化程序,而是日期分析程序。 – Svante