2013-08-23 97 views
1

我发现在通用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))) 
+1

你必须对你的问题更具体。这里有什么问题,哪些不起作用? –

+2

这不是日期格式化程序,而是日期分析程序。 – Svante

回答

4

local-time是日期和时间库,多科是here,最近2个月前正在积极开发。在你的口齿不清壳,按下回车(假设你已经quicklisp安装)

这是第三结果在谷歌搜索“Common Lisp的日期(本地时间:quickload QL)

您可以通过键入安装和时间“,第一个是this link to the common lisp cookbook page on dates & times

希望他们帮忙!

[编辑]

更多信息!该库非常酷,所以我虽然只是发布此附录:

local-time:parse-timestring是很好的,因为您可以精确指定datetime字符串的布局方式。默认情况下,它预计日期分隔符是#\ - 时间分隔符是#\:这两个都是正确的(请记住#\用于指定一个字符),但是我必须将日期时间分隔符设置为由于我的输入在日期和时间之间有空格,因此请注意#空格。见下文!。

CL-USER> (local-time:parse-timestring "2013-01-23 12:12:12" :date-time-separator #\space) 
@2013-01-23T12:12:12.000000Z