0

SimpleDateFormat我发现在 common lisp中没有像 Java 这样强大的工具。

原理我太难理解了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 )))
4

1 回答 1

4

local-time是一个日期和时间库,doco 就在这里,直到2 个月前还在积极开发中。

您可以通过在 lisp shell 中键入 (ql:quickload :local-time) 并按回车键来安装它(假设您已安装 quicklisp)

这是谷歌搜索“common lisp dates and times”中的第三个结果,第一个是这个指向日期和时间的 common lisp 食谱页面的链接

希望他们有所帮助!

[编辑]

更多信息!该库非常酷,所以我想发布这个附录:

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.000000Z
于 2013-08-23T06:27:39.777 回答