Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-01-28

KMRCLを眺める (75) WITH-UTIME-DECODING-UTC-OFFSET

| 23:46 | KMRCLを眺める (75) WITH-UTIME-DECODING-UTC-OFFSET - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (75) WITH-UTIME-DECODING-UTC-OFFSET - わだばLisperになる

今回はKMRCLのio.lisp中からWITH-UTIME-DECODING-UTC-OFFSETです。

WITH-UTIME-DECODINGにUTCからのオフセットを指定できるもののようです。

定義を眺めてみると

(defmacro with-utime-decoding-utc-offset ((utime utc-offset) &body body)
  (with-gensyms (zone)
    `(let* ((,zone (cond
                    ((eq :utc ,utc-offset)
                     0)
                    ((null ,utc-offset)
                     nil)
                    (t
                     (if (is-dst ,utime)
                         (1- (- ,utc-offset))
                       (- ,utc-offset))))))
       (if ,zone
           (with-utime-decoding (,utime ,zone)
             ,@body)
         (with-utime-decoding (,utime)
           ,@body)))))

というもの。

動作例は、

(WITH-UTIME-DECODING-UTC-OFFSET ((GET-UNIVERSAL-TIME) NIL)
  (LIST YEAR MONTH DAY-OF-MONTH HOUR MINUTE))
⇒ (2010 1 28 23 45)

(WITH-UTIME-DECODING-UTC-OFFSET ((GET-UNIVERSAL-TIME) 0)
  (LIST YEAR MONTH DAY-OF-MONTH HOUR MINUTE))
⇒ (2010 1 28 14 45)

(WITH-UTIME-DECODING-UTC-OFFSET ((GET-UNIVERSAL-TIME) :UTC)
  (LIST YEAR MONTH DAY-OF-MONTH HOUR MINUTE))
⇒ (2010 1 28 14 46)

(WITH-UTIME-DECODING-UTC-OFFSET ((GET-UNIVERSAL-TIME) 9)
 (LIST YEAR MONTH DAY-OF-MONTH HOUR MINUTE))
⇒ (2010 1 28 23 48)

世界時計を作るのに便利そうです。