2013-08-23 99 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