首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Common Lisp在Java语言中创建一个类似于SimpleDateFormat的函数

使用Common Lisp在Java语言中创建一个类似于SimpleDateFormat的函数
EN

Stack Overflow用户
提问于 2013-08-23 11:45:40
回答 1查看 167关注 0票数 0

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

理解SimpleDateFormat的原理对我来说太难了,所以我只能自己写了。我写了一个‘日期格式化’的函数,但我认为它太难看了,而且存在一些bug。

你能解释一下SimpleDateFormat是如何实现或提供强大功能的吗?

代码语言:javascript
复制
(defparameter *pattern-char* "yMdhHmsS")

函数DATE-FORMATTER

代码语言:javascript
复制
(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)))    

示例:

代码语言:javascript
复制
(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 )))
EN

回答 1

Stack Overflow用户

发布于 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,因为我的输入在日期和时间之间有一个空格。请看下面的!

代码语言:javascript
复制
CL-USER> (local-time:parse-timestring "2013-01-23 12:12:12" :date-time-separator #\space) 
 @2013-01-23T12:12:12.000000Z
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18394356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档