Vim window logic, slimv
This commit is contained in:
parent
babcc9e44b
commit
515847d07e
791 changed files with 51552 additions and 86 deletions
|
|
@ -0,0 +1,16 @@
|
|||
# -*- Mode: Makefile; tab-width: 4; indent-tabs-mode: t -*-
|
||||
|
||||
all: docs
|
||||
|
||||
docs:
|
||||
sh gendocs.sh -o manual --html "--css-include=style.css" local-time "The local-time Manual"
|
||||
|
||||
clean:
|
||||
find . \( -name "*.info" -o -name "*.it" -o -name "*.aux" -o -name "*.cp" -o -name "*.fn" -o -name "*.fns" -o -name "*.ky" -o -name "*.log" -o -name "*.pg" -o -name "*.toc" -o -name "*.tp" -o -name "*.vr" -o -name "*.dvi" -o -name "*.cps" -o -name "*.vrs" \) -exec rm {} \;
|
||||
rm -rf manual
|
||||
|
||||
upload-docs:
|
||||
rsync -av --delete -e ssh manual common-lisp.net:/project/local-time/public_html/
|
||||
# scp -r manual spec common-lisp.net:/project/local-time/public_html/
|
||||
|
||||
# vim: ft=make ts=4 noet
|
||||
|
|
@ -0,0 +1,285 @@
|
|||
#!/bin/sh
|
||||
# gendocs.sh -- generate a GNU manual in many formats. This script is
|
||||
# mentioned in maintain.texi. See the help message below for usage details.
|
||||
# $Id: gendocs.sh,v 1.17 2006/05/19 00:07:52 karl Exp $
|
||||
#
|
||||
# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, you can either send email to this
|
||||
# program's maintainer or write to: The Free Software Foundation,
|
||||
# Inc.; 51 Franklin Street, Fifth Floor; Boston, MA 02110-1301, USA.
|
||||
#
|
||||
# Original author: Mohit Agarwal.
|
||||
# Send bug reports and any other correspondence to bug-texinfo@gnu.org.
|
||||
|
||||
prog=`basename "$0"`
|
||||
srcdir=`pwd`
|
||||
|
||||
scripturl="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs.sh"
|
||||
templateurl="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs_template"
|
||||
|
||||
: ${MAKEINFO="makeinfo"}
|
||||
: ${TEXI2DVI="texi2dvi -t @finalout"}
|
||||
: ${DVIPS="dvips"}
|
||||
: ${DOCBOOK2TXT="docbook2txt"}
|
||||
: ${DOCBOOK2HTML="docbook2html"}
|
||||
: ${DOCBOOK2PDF="docbook2pdf"}
|
||||
: ${DOCBOOK2PS="docbook2ps"}
|
||||
: ${GENDOCS_TEMPLATE_DIR="."}
|
||||
unset CDPATH
|
||||
|
||||
rcs_revision='$Revision: 1.17 $'
|
||||
rcs_version=`set - $rcs_revision; echo $2`
|
||||
program=`echo "$0" | sed -e 's!.*/!!'`
|
||||
version="gendocs.sh $rcs_version
|
||||
|
||||
Copyright (C) 2006 Free Software Foundation, Inc.
|
||||
There is NO warranty. You may redistribute this software
|
||||
under the terms of the GNU General Public License.
|
||||
For more information about these matters, see the files named COPYING."
|
||||
|
||||
usage="Usage: $prog [OPTION]... PACKAGE MANUAL-TITLE
|
||||
|
||||
Generate various output formats from PACKAGE.texinfo (or .texi or .txi) source.
|
||||
See the GNU Maintainers document for a more extensive discussion:
|
||||
http://www.gnu.org/prep/maintain_toc.html
|
||||
|
||||
Options:
|
||||
-o OUTDIR write files into OUTDIR, instead of manual/.
|
||||
--docbook convert to DocBook too (xml, txt, html, pdf and ps).
|
||||
--html ARG pass indicated ARG to makeinfo for HTML targets.
|
||||
--help display this help and exit successfully.
|
||||
--version display version information and exit successfully.
|
||||
|
||||
Simple example: $prog emacs \"GNU Emacs Manual\"
|
||||
|
||||
Typical sequence:
|
||||
cd YOURPACKAGESOURCE/doc
|
||||
wget \"$scripturl\"
|
||||
wget \"$templateurl\"
|
||||
$prog YOURMANUAL \"GNU YOURMANUAL - One-line description\"
|
||||
|
||||
Output will be in a new subdirectory \"manual\" (by default, use -o OUTDIR
|
||||
to override). Move all the new files into your web CVS tree, as
|
||||
explained in the Web Pages node of maintain.texi.
|
||||
|
||||
MANUAL-TITLE is included as part of the HTML <title> of the overall
|
||||
manual/index.html file. It should include the name of the package being
|
||||
documented. manual/index.html is created by substitution from the file
|
||||
$GENDOCS_TEMPLATE_DIR/gendocs_template. (Feel free to modify the
|
||||
generic template for your own purposes.)
|
||||
|
||||
If you have several manuals, you'll need to run this script several
|
||||
times with different YOURMANUAL values, specifying a different output
|
||||
directory with -o each time. Then write (by hand) an overall index.html
|
||||
with links to them all.
|
||||
|
||||
You can set the environment variables MAKEINFO, TEXI2DVI, and DVIPS to
|
||||
control the programs that get executed, and GENDOCS_TEMPLATE_DIR to
|
||||
control where the gendocs_template file is looked for.
|
||||
|
||||
Email bug reports or enhancement requests to bug-texinfo@gnu.org.
|
||||
"
|
||||
|
||||
calcsize()
|
||||
{
|
||||
size=`ls -ksl $1 | awk '{print $1}'`
|
||||
echo $size
|
||||
}
|
||||
|
||||
outdir=manual
|
||||
html=
|
||||
PACKAGE=
|
||||
MANUAL_TITLE=
|
||||
|
||||
while test $# -gt 0; do
|
||||
case $1 in
|
||||
--help) echo "$usage"; exit 0;;
|
||||
--version) echo "$version"; exit 0;;
|
||||
-o) shift; outdir=$1;;
|
||||
--docbook) docbook=yes;;
|
||||
--html) shift; html=$1;;
|
||||
-*)
|
||||
echo "$0: Unknown or ambiguous option \`$1'." >&2
|
||||
echo "$0: Try \`--help' for more information." >&2
|
||||
exit 1;;
|
||||
*)
|
||||
if test -z "$PACKAGE"; then
|
||||
PACKAGE=$1
|
||||
elif test -z "$MANUAL_TITLE"; then
|
||||
MANUAL_TITLE=$1
|
||||
else
|
||||
echo "$0: extra non-option argument \`$1'." >&2
|
||||
exit 1
|
||||
fi;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if test -s "$srcdir/$PACKAGE.texinfo"; then
|
||||
srcfile=$srcdir/$PACKAGE.texinfo
|
||||
elif test -s "$srcdir/$PACKAGE.texi"; then
|
||||
srcfile=$srcdir/$PACKAGE.texi
|
||||
elif test -s "$srcdir/$PACKAGE.txi"; then
|
||||
srcfile=$srcdir/$PACKAGE.txi
|
||||
else
|
||||
echo "$0: cannot find .texinfo or .texi or .txi for $PACKAGE in $srcdir." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test ! -r $GENDOCS_TEMPLATE_DIR/gendocs_template; then
|
||||
echo "$0: cannot read $GENDOCS_TEMPLATE_DIR/gendocs_template." >&2
|
||||
echo "$0: it is available from $templateurl." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo Generating output formats for $srcfile
|
||||
|
||||
cmd="${MAKEINFO} -o $PACKAGE.info \"$srcfile\""
|
||||
echo "Generating info files... ($cmd)"
|
||||
eval "$cmd"
|
||||
mkdir -p $outdir/
|
||||
tar czf $outdir/$PACKAGE.info.tar.gz $PACKAGE.info*
|
||||
info_tgz_size=`calcsize $outdir/$PACKAGE.info.tar.gz`
|
||||
# do not mv the info files, there's no point in having them available
|
||||
# separately on the web.
|
||||
|
||||
cmd="${TEXI2DVI} \"$srcfile\""
|
||||
echo "Generating dvi ... ($cmd)"
|
||||
eval "$cmd"
|
||||
|
||||
# now, before we compress dvi:
|
||||
echo Generating postscript...
|
||||
${DVIPS} $PACKAGE -o
|
||||
gzip -f -9 $PACKAGE.ps
|
||||
ps_gz_size=`calcsize $PACKAGE.ps.gz`
|
||||
mv $PACKAGE.ps.gz $outdir/
|
||||
|
||||
# compress/finish dvi:
|
||||
gzip -f -9 $PACKAGE.dvi
|
||||
dvi_gz_size=`calcsize $PACKAGE.dvi.gz`
|
||||
mv $PACKAGE.dvi.gz $outdir/
|
||||
|
||||
cmd="${TEXI2DVI} --pdf \"$srcfile\""
|
||||
echo "Generating pdf ... ($cmd)"
|
||||
eval "$cmd"
|
||||
pdf_size=`calcsize $PACKAGE.pdf`
|
||||
mv $PACKAGE.pdf $outdir/
|
||||
|
||||
cmd="${MAKEINFO} -o $PACKAGE.txt --no-split --no-headers \"$srcfile\""
|
||||
echo "Generating ASCII... ($cmd)"
|
||||
eval "$cmd"
|
||||
ascii_size=`calcsize $PACKAGE.txt`
|
||||
gzip -f -9 -c $PACKAGE.txt >$outdir/$PACKAGE.txt.gz
|
||||
ascii_gz_size=`calcsize $outdir/$PACKAGE.txt.gz`
|
||||
mv $PACKAGE.txt $outdir/
|
||||
|
||||
cmd="${MAKEINFO} --no-split --html -o $PACKAGE.html $html \"$srcfile\""
|
||||
echo "Generating monolithic html... ($cmd)"
|
||||
rm -rf $PACKAGE.html # in case a directory is left over
|
||||
eval "$cmd"
|
||||
html_mono_size=`calcsize $PACKAGE.html`
|
||||
gzip -f -9 -c $PACKAGE.html >$outdir/$PACKAGE.html.gz
|
||||
html_mono_gz_size=`calcsize $outdir/$PACKAGE.html.gz`
|
||||
mv $PACKAGE.html $outdir/
|
||||
|
||||
cmd="${MAKEINFO} --html -o $PACKAGE.html $html \"$srcfile\""
|
||||
echo "Generating html by node... ($cmd)"
|
||||
eval "$cmd"
|
||||
split_html_dir=$PACKAGE.html
|
||||
(
|
||||
cd ${split_html_dir} || exit 1
|
||||
tar -czf ../$outdir/${PACKAGE}.html_node.tar.gz -- *.html
|
||||
)
|
||||
html_node_tgz_size=`calcsize $outdir/${PACKAGE}.html_node.tar.gz`
|
||||
rm -f $outdir/html_node/*.html
|
||||
mkdir -p $outdir/html_node/
|
||||
mv ${split_html_dir}/*.html $outdir/html_node/
|
||||
rmdir ${split_html_dir}
|
||||
|
||||
echo Making .tar.gz for sources...
|
||||
srcfiles=`ls *.texinfo *.texi *.txi *.eps 2>/dev/null`
|
||||
tar cvzfh $outdir/$PACKAGE.texi.tar.gz $srcfiles
|
||||
texi_tgz_size=`calcsize $outdir/$PACKAGE.texi.tar.gz`
|
||||
|
||||
if test -n "$docbook"; then
|
||||
cmd="${MAKEINFO} -o - --docbook \"$srcfile\" > ${srcdir}/$PACKAGE-db.xml"
|
||||
echo "Generating docbook XML... $(cmd)"
|
||||
eval "$cmd"
|
||||
docbook_xml_size=`calcsize $PACKAGE-db.xml`
|
||||
gzip -f -9 -c $PACKAGE-db.xml >$outdir/$PACKAGE-db.xml.gz
|
||||
docbook_xml_gz_size=`calcsize $outdir/$PACKAGE-db.xml.gz`
|
||||
mv $PACKAGE-db.xml $outdir/
|
||||
|
||||
cmd="${DOCBOOK2HTML} -o $split_html_db_dir ${outdir}/$PACKAGE-db.xml"
|
||||
echo "Generating docbook HTML... ($cmd)"
|
||||
eval "$cmd"
|
||||
split_html_db_dir=html_node_db
|
||||
(
|
||||
cd ${split_html_db_dir} || exit 1
|
||||
tar -czf ../$outdir/${PACKAGE}.html_node_db.tar.gz -- *.html
|
||||
)
|
||||
html_node_db_tgz_size=`calcsize $outdir/${PACKAGE}.html_node_db.tar.gz`
|
||||
rm -f $outdir/html_node_db/*.html
|
||||
mkdir -p $outdir/html_node_db
|
||||
mv ${split_html_db_dir}/*.html $outdir/html_node_db/
|
||||
rmdir ${split_html_db_dir}
|
||||
|
||||
cmd="${DOCBOOK2TXT} ${outdir}/$PACKAGE-db.xml"
|
||||
echo "Generating docbook ASCII... ($cmd)"
|
||||
eval "$cmd"
|
||||
docbook_ascii_size=`calcsize $PACKAGE-db.txt`
|
||||
mv $PACKAGE-db.txt $outdir/
|
||||
|
||||
cmd="${DOCBOOK2PS} ${outdir}/$PACKAGE-db.xml"
|
||||
echo "Generating docbook PS... $(cmd)"
|
||||
eval "$cmd"
|
||||
gzip -f -9 -c $PACKAGE-db.ps >$outdir/$PACKAGE-db.ps.gz
|
||||
docbook_ps_gz_size=`calcsize $outdir/$PACKAGE-db.ps.gz`
|
||||
mv $PACKAGE-db.ps $outdir/
|
||||
|
||||
cmd="${DOCBOOK2PDF} ${outdir}/$PACKAGE-db.xml"
|
||||
echo "Generating docbook PDF... ($cmd)"
|
||||
eval "$cmd"
|
||||
docbook_pdf_size=`calcsize $PACKAGE-db.pdf`
|
||||
mv $PACKAGE-db.pdf $outdir/
|
||||
fi
|
||||
|
||||
echo Writing index file...
|
||||
curdate=`date '+%B %d, %Y'`
|
||||
sed \
|
||||
-e "s!%%TITLE%%!$MANUAL_TITLE!g" \
|
||||
-e "s!%%DATE%%!$curdate!g" \
|
||||
-e "s!%%PACKAGE%%!$PACKAGE!g" \
|
||||
-e "s!%%HTML_MONO_SIZE%%!$html_mono_size!g" \
|
||||
-e "s!%%HTML_MONO_GZ_SIZE%%!$html_mono_gz_size!g" \
|
||||
-e "s!%%HTML_NODE_TGZ_SIZE%%!$html_node_tgz_size!g" \
|
||||
-e "s!%%INFO_TGZ_SIZE%%!$info_tgz_size!g" \
|
||||
-e "s!%%DVI_GZ_SIZE%%!$dvi_gz_size!g" \
|
||||
-e "s!%%PDF_SIZE%%!$pdf_size!g" \
|
||||
-e "s!%%PS_GZ_SIZE%%!$ps_gz_size!g" \
|
||||
-e "s!%%ASCII_SIZE%%!$ascii_size!g" \
|
||||
-e "s!%%ASCII_GZ_SIZE%%!$ascii_gz_size!g" \
|
||||
-e "s!%%TEXI_TGZ_SIZE%%!$texi_tgz_size!g" \
|
||||
-e "s!%%DOCBOOK_HTML_NODE_TGZ_SIZE%%!$html_node_db_tgz_size!g" \
|
||||
-e "s!%%DOCBOOK_ASCII_SIZE%%!$docbook_ascii_size!g" \
|
||||
-e "s!%%DOCBOOK_PS_GZ_SIZE%%!$docbook_ps_gz_size!g" \
|
||||
-e "s!%%DOCBOOK_PDF_SIZE%%!$docbook_pdf_size!g" \
|
||||
-e "s!%%DOCBOOK_XML_SIZE%%!$docbook_xml_size!g" \
|
||||
-e "s!%%DOCBOOK_XML_GZ_SIZE%%!$docbook_xml_gz_size!g" \
|
||||
-e "s,%%SCRIPTURL%%,$scripturl,g" \
|
||||
-e "s!%%SCRIPTNAME%%!$prog!g" \
|
||||
$GENDOCS_TEMPLATE_DIR/gendocs_template >$outdir/index.html
|
||||
|
||||
echo "Done! See $outdir/ subdirectory for new files."
|
||||
|
|
@ -0,0 +1,260 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<!-- $Id: gendocs_template,v 1.7 2005/05/15 00:00:08 karl Exp $ -->
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
|
||||
<!--
|
||||
|
||||
This template was adapted from Texinfo:
|
||||
http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs_template
|
||||
|
||||
-->
|
||||
|
||||
|
||||
<head>
|
||||
<title>%%TITLE%%</title>
|
||||
<meta http-equiv="content-type" content='text/html; charset=utf-8' />
|
||||
<!-- <link rel="stylesheet" type="text/css" href="/gnu.css" /> -->
|
||||
<!-- <link rev="made" href="webmasters@gnu.org" /> -->
|
||||
<style>
|
||||
/* CSS style taken from http://gnu.org/gnu.css */
|
||||
|
||||
html, body {
|
||||
background-color: #FFFFFF;
|
||||
color: #000000;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
a:link {
|
||||
color: #1f00ff;
|
||||
background-color: transparent;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
a:visited {
|
||||
color: #9900dd;
|
||||
background-color: transparent;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #9900dd;
|
||||
background-color: transparent;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.italic {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.quote {
|
||||
margin-left: 40px;
|
||||
margin-right: 40px;
|
||||
}
|
||||
|
||||
.hrsmall {
|
||||
width: 80px;
|
||||
height: 1px;
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.td_title {
|
||||
border-color: #3366cc;
|
||||
border-style: solid;
|
||||
border-width: thin;
|
||||
color: #3366cc;
|
||||
background-color : #f2f2f9;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.td_con {
|
||||
padding-top: 3px;
|
||||
padding-left: 8px;
|
||||
padding-bottom: 3px;
|
||||
color : #303030;
|
||||
background-color : #fefefe;
|
||||
font-size: smaller;
|
||||
}
|
||||
|
||||
.translations {
|
||||
background-color: transparent;
|
||||
color: black;
|
||||
font-family: serif;
|
||||
font-size: smaller;
|
||||
}
|
||||
|
||||
.fsflink {
|
||||
font-size: smaller;
|
||||
font-family: monospace;
|
||||
color : #000000;
|
||||
border-left: #3366cc thin solid;
|
||||
border-bottom: #3366cc thin solid;
|
||||
padding-left: 5px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
/*
|
||||
* rtl stands for right-to-left layout, as in farsi/persian,
|
||||
* arabic, etc. See also trans_rtl.
|
||||
*/
|
||||
.fsflink_rtl {
|
||||
font-size: smaller;
|
||||
font-family: monospace;
|
||||
color : #000000;
|
||||
border-right: #3366cc thin solid;
|
||||
border-bottom: #3366cc thin solid;
|
||||
padding-right: 5px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.trans {
|
||||
font-size: smaller;
|
||||
color : #000000;
|
||||
border-left: #3366cc thin solid;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
.trans_rtl {
|
||||
font-size: smaller;
|
||||
color : #000000;
|
||||
border-right: #3366cc thin solid;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
img {
|
||||
border: none 0;
|
||||
}
|
||||
|
||||
td.side {
|
||||
color: #3366cc;
|
||||
/* background: #f2f2f9;
|
||||
border-color: #3366cc;
|
||||
border-style: solid;
|
||||
border-width: thin; */
|
||||
border-color: white;
|
||||
border-style: none;
|
||||
vertical-align: top;
|
||||
width: 150px;
|
||||
}
|
||||
|
||||
div.copyright {
|
||||
font-size: 80%;
|
||||
border: 2px solid #3366cc;
|
||||
padding: 4px;
|
||||
background: #f2f2f9;
|
||||
border-style: solid;
|
||||
border-width: thin;
|
||||
}
|
||||
|
||||
.footnoteref {
|
||||
font-size: smaller;
|
||||
vertical-align: text-top;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<!-- This document is in XML, and xhtml 1.0 -->
|
||||
<!-- Please make sure to properly nest your tags -->
|
||||
<!-- and ensure that your final document validates -->
|
||||
<!-- consistent with W3C xhtml 1.0 and CSS standards -->
|
||||
<!-- See validator.w3.org -->
|
||||
|
||||
<body>
|
||||
|
||||
<h3>%%TITLE%%</h3>
|
||||
|
||||
<!-- <address>Free Software Foundation</address> -->
|
||||
<address>last updated %%DATE%%</address>
|
||||
|
||||
<!--
|
||||
<p>
|
||||
<a href="/graphics/gnu-head.jpg">
|
||||
<img src="/graphics/gnu-head-sm.jpg"
|
||||
alt=" [image of the head of a GNU] "
|
||||
width="129" height="122" />
|
||||
</a>
|
||||
<a href="/philosophy/gif.html">(no gifs due to patent problems)</a>
|
||||
</p>
|
||||
-->
|
||||
|
||||
<hr />
|
||||
|
||||
<p>This document <!--(%%PACKAGE%%)--> is available in the following formats:</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="%%PACKAGE%%.html">HTML
|
||||
(%%HTML_MONO_SIZE%%K characters)</a> - entirely on one web page.</li>
|
||||
<li><a href="html_node/index.html">HTML</a> - with one web page per
|
||||
node.</li>
|
||||
<li><a href="%%PACKAGE%%.html.gz">HTML compressed
|
||||
(%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on
|
||||
one web page.</li>
|
||||
<li><a href="%%PACKAGE%%.html_node.tar.gz">HTML compressed
|
||||
(%%HTML_NODE_TGZ_SIZE%%K gzipped tar file)</a> -
|
||||
with one web page per node.</li>
|
||||
<li><a href="%%PACKAGE%%.info.tar.gz">Info document
|
||||
(%%INFO_TGZ_SIZE%%K characters gzipped tar file)</a>.</li>
|
||||
<li><a href="%%PACKAGE%%.txt">ASCII text
|
||||
(%%ASCII_SIZE%%K characters)</a>.</li>
|
||||
<li><a href="%%PACKAGE%%.txt.gz">ASCII text compressed
|
||||
(%%ASCII_GZ_SIZE%%K gzipped characters)</a>.</li>
|
||||
<li><a href="%%PACKAGE%%.dvi.gz">TeX dvi file
|
||||
(%%DVI_GZ_SIZE%%K characters gzipped)</a>.</li>
|
||||
<li><a href="%%PACKAGE%%.ps.gz">PostScript file
|
||||
(%%PS_GZ_SIZE%%K characters gzipped)</a>.</li>
|
||||
<li><a href="%%PACKAGE%%.pdf">PDF file
|
||||
(%%PDF_SIZE%%K characters)</a>.</li>
|
||||
<li><a href="%%PACKAGE%%.texi.tar.gz">Texinfo source
|
||||
(%%TEXI_TGZ_SIZE%%K characters gzipped tar file)</a></li>
|
||||
</ul>
|
||||
|
||||
<p>(This page was generated by the <a href="%%SCRIPTURL%%">%%SCRIPTNAME%%
|
||||
script</a>.)</p>
|
||||
|
||||
<div class="copyright">
|
||||
<p>
|
||||
Return to <a href="/project/local-time/">local-time's home page</a>.
|
||||
</p>
|
||||
|
||||
<!--
|
||||
<p>
|
||||
Please send FSF & GNU inquiries to
|
||||
<a href="mailto:gnu@gnu.org"><em>gnu@gnu.org</em></a>.
|
||||
There are also <a href="/home.html#ContactInfo">other ways to contact</a>
|
||||
the FSF.
|
||||
<br />
|
||||
Please send broken links and other corrections (or suggestions) to
|
||||
<a href="mailto:webmasters@gnu.org"><em>webmasters@gnu.org</em></a>.
|
||||
</p>
|
||||
-->
|
||||
|
||||
<p>
|
||||
<!--
|
||||
Copyright (C) 2008
|
||||
Daniel Lowe <dlowe dlowe.net>
|
||||
Attila Lendvai <attila.lendvai gmail.com>
|
||||
<br />
|
||||
Verbatim copying and distribution of this entire article is
|
||||
permitted in any medium, provided this notice is preserved.
|
||||
-->
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Updated: %%DATE%%
|
||||
<!-- timestamp start -->
|
||||
<!-- $Date: 2005/05/15 00:00:08 $ $Author: karl $ -->
|
||||
<!-- timestamp end -->
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,774 @@
|
|||
\input texinfo @c -*- Mode: Texinfo; Mode: auto-fill -*-
|
||||
@c %**start of header
|
||||
@setfilename local-time.info
|
||||
@settitle The local-time Manual
|
||||
@exampleindent 2
|
||||
|
||||
@c @documentencoding utf-8
|
||||
|
||||
@macro name {}
|
||||
@code{local-time}
|
||||
@end macro
|
||||
|
||||
@macro mathx {tex, non-tex}
|
||||
@iftex
|
||||
@math{\tex\}
|
||||
@end iftex
|
||||
@ifnottex
|
||||
@emph{\non-tex\}
|
||||
@end ifnottex
|
||||
@end macro
|
||||
|
||||
@macro impnote {text}
|
||||
@quotation Implementor's note
|
||||
@emph{\text\}
|
||||
@end quotation
|
||||
@end macro
|
||||
|
||||
@c Set ROMANCOMMENTS to get comments in roman font.
|
||||
@ifset ROMANCOMMENTS
|
||||
@alias lispcmt = r
|
||||
@end ifset
|
||||
@ifclear ROMANCOMMENTS
|
||||
@alias lispcmt = asis
|
||||
@end ifclear
|
||||
|
||||
@c Index for public api.
|
||||
@defindex it
|
||||
|
||||
@macro pub {name}
|
||||
@itindex \name\
|
||||
@c
|
||||
@end macro
|
||||
|
||||
@macro k {what}
|
||||
@code{\what\}
|
||||
@end macro
|
||||
|
||||
@iftex
|
||||
@alias v = asis
|
||||
@alias cl = code
|
||||
@end iftex
|
||||
|
||||
@ifnottex
|
||||
@alias v = var
|
||||
@alias cl = strong
|
||||
@end ifnottex
|
||||
|
||||
@c Show variables, clauses, and concepts in the same index.
|
||||
@syncodeindex it cp
|
||||
@syncodeindex vr cp
|
||||
|
||||
@copying
|
||||
Copyright @copyright{} 2012 Daniel Lowe <dlowe dlowe.net> @*
|
||||
Copyright @copyright{} 2012 Attila Lendvai <attila.lendvai gmail.com> @*
|
||||
|
||||
@quotation
|
||||
This manual describes the @name{} Common Lisp library which is
|
||||
based on Erik Naggum's @emph{The Long, Painful History of Time}
|
||||
[NaggumPaper] paper.
|
||||
|
||||
@end quotation
|
||||
@end copying
|
||||
@c %**end of header
|
||||
|
||||
@titlepage
|
||||
@title The @name{} Manual
|
||||
@subtitle Version 1.0.0
|
||||
@author Daniel Lowe
|
||||
@author Attila Lendvai
|
||||
|
||||
@page
|
||||
@vskip 0pt plus 1filll
|
||||
@insertcopying
|
||||
@end titlepage
|
||||
|
||||
@contents
|
||||
|
||||
@ifnottex
|
||||
@node Top
|
||||
@top @name{}
|
||||
@insertcopying
|
||||
@end ifnottex
|
||||
|
||||
@menu
|
||||
* Introduction::
|
||||
* Public API::
|
||||
* Other Features::
|
||||
* References::
|
||||
* Comprehensive Index::
|
||||
@end menu
|
||||
|
||||
@c ===================================================================
|
||||
@node Introduction
|
||||
@chapter Introduction
|
||||
|
||||
@menu
|
||||
* Portability::
|
||||
@end menu
|
||||
|
||||
The @name{} library is a Common Lisp library for the manipulation of
|
||||
dates, times and intervals. It was originally based almost entirely
|
||||
upon Erik Naggum's paper @emph{The Long Painful History of Time}
|
||||
[NaggumPaper]. Many of the core concepts originated from this paper,
|
||||
such as the seperation of days and seconds, the choice of 2000-03-01
|
||||
as the standard epoch, and the timestring format.
|
||||
|
||||
@c ===================================================================
|
||||
@node Portability
|
||||
@section Portability
|
||||
|
||||
This implementation assumes that time zone information is stored in
|
||||
the tzfile format. The default timezone is loaded from
|
||||
/etc/localtime. On non-POSIX systems, this will certainly give
|
||||
different results than the system time handling.
|
||||
|
||||
local-time currently supports sub-second precision clocks with ABCL,
|
||||
Allegro, CMUCL, CCL, SBCL, and LispWorks for Linux or Darwin. All
|
||||
others will be able to retrieve the time with second precision using
|
||||
@code{get-universal-time}. You may add support for your own
|
||||
implementation by implementing the clock generic protocol documented
|
||||
here.
|
||||
|
||||
@c ===================================================================
|
||||
@node Public API
|
||||
@chapter Public API
|
||||
|
||||
@menu
|
||||
* Types::
|
||||
* Timezones::
|
||||
* Creating timestamp Objects::
|
||||
* Querying timestamp Objects::
|
||||
* Manipulating Date and Time Values::
|
||||
* Parsing and Formatting::
|
||||
* Clocks::
|
||||
@end menu
|
||||
|
||||
@c ===================================================================
|
||||
@node Types
|
||||
@section Types
|
||||
|
||||
It's a good idea to treat all values as immutable objects. @name{}
|
||||
will not modify any object it was given unless explicitly asked to by
|
||||
the @code{:into} keyword argument.
|
||||
|
||||
@itindex timestamp
|
||||
@deftp Class timestamp day sec nsec
|
||||
|
||||
@code{timestamp} values can represent either a @emph{date},
|
||||
a @emph{daytime} or a @emph{time} value. It has the following slots:
|
||||
|
||||
@lisp
|
||||
(defclass timestamp ()
|
||||
((day :type integer)
|
||||
(sec :type integer)
|
||||
(nsec :type (integer 0 999999999))))
|
||||
@end lisp
|
||||
|
||||
The following constraints apply to the specific types:
|
||||
@itemize
|
||||
|
||||
@item
|
||||
@emph{date}: must have a @var{+utc-zone+} timezone and the @var{sec}
|
||||
slot must be the first second of a day; In other words, the time
|
||||
elements of the @code{timestamp} value must have their least possible
|
||||
values.
|
||||
|
||||
@item
|
||||
@emph{time}: the @var{day} slot must be zero.
|
||||
|
||||
@end itemize
|
||||
@end deftp
|
||||
|
||||
@deftp Struct timezone path name loaded
|
||||
|
||||
@code{timezone} objects represent timezones - local and political
|
||||
modifications to the time representation. Timezones are responsible
|
||||
for storing offsets from GMT, abbreviations for different
|
||||
sub-timezones, and the times each sub-timezone is to be in effect.
|
||||
|
||||
@end deftp
|
||||
|
||||
@c ===================================================================
|
||||
@node Timezones
|
||||
@section Timezones
|
||||
|
||||
@itindex *default-timezone*
|
||||
@defvr Default *default-timezone*
|
||||
|
||||
The variable @var{*default-timezone*} contains the timezone that will
|
||||
be used by default if none is specified. It is loaded from
|
||||
@emph{/etc/localtime} when the library is loaded. If
|
||||
@emph{/etc/localtime} is not present, it will default to UTC.
|
||||
|
||||
@end defvr
|
||||
|
||||
@itindex +utc-zone+
|
||||
@defvr Constant +utc-zone+
|
||||
|
||||
The variable @var{+utc-zone+} contains a timezone corresponding to
|
||||
UTC.
|
||||
|
||||
@end defvr
|
||||
|
||||
|
||||
@itindex define-timezone
|
||||
@defmac define-timezone zone-name zone-file &key (load nil)
|
||||
|
||||
Define @var{zone-name} (a symbol or a string) as a new timezone,
|
||||
lazy-loaded from @var{zone-file} (a pathname designator relative to
|
||||
the zoneinfo directory on this system. If @var{load} is true, load
|
||||
immediately.
|
||||
|
||||
@end defmac
|
||||
|
||||
@itindex find-timezone-by-location-name
|
||||
@defun find-timezone-by-location-name name
|
||||
|
||||
Returns the timezone found at the location name (such as
|
||||
@code{US/Eastern}). @code{reread-timezone-repository} must be called
|
||||
before this function is used.
|
||||
|
||||
@end defun
|
||||
|
||||
@itindex reread-timezone-repository
|
||||
@defun reread-timezone-repository &key (timezone-repository *default-timezone-repository-path*)
|
||||
|
||||
Walks the current repository, reading all tzinfo files updating
|
||||
indexes. The default timezone repository is set to the zoneinfo/
|
||||
directory of the local-time system.
|
||||
|
||||
@end defun
|
||||
|
||||
@c ===================================================================
|
||||
@node Creating timestamp Objects
|
||||
@section Creating @code{timestamp} Objects
|
||||
|
||||
@itindex universal-to-timestamp
|
||||
@defun universal-to-timestamp universal &key (nsec 0)
|
||||
|
||||
Produces a @code{timestamp} instance from the provided universal time
|
||||
@var{universal}. Universal time is defined in the Common Lisp
|
||||
Specification as the number of seconds since 1900-01-01T00:00:00Z.
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex unix-to-timestamp
|
||||
@defun unix-to-timestamp unix &key (nsec 0)
|
||||
|
||||
Produces a @code{timestamp} instance from the provided unix time
|
||||
@var{unix}. Unix time is defined by POSIX as the number of seconds
|
||||
since 1970-01-01T00:00:00Z.
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex now
|
||||
@defun now
|
||||
|
||||
Produces a @code{timestamp} instance with the current time. With
|
||||
Allegro, CMUCL, CCL, SBCL, and LispWorks for Linux or Darwin, the new
|
||||
timestamp will be precise to the microsecond (usec); with ABCL, to the
|
||||
millisecond (ms). Otherwise, the precision is limited to the second.
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex today
|
||||
@defun today
|
||||
|
||||
Produces a @code{timestamp} instance that corresponds to today's
|
||||
date, which is the midnight of the current day in the UTC zone.
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex encode-timestamp
|
||||
@defun encode-timestamp nsec sec minute hour day month year &key timezone offset into
|
||||
|
||||
Returns a new @code{timestamp} instance corresponding to the specified
|
||||
time elements. The @var{offset} is the number of seconds offset from
|
||||
UTC of the locale. If @var{offset} is not specified, the offset will
|
||||
be guessed from the @var{timezone}. If a @code{timestamp} is passed
|
||||
as the @var{into} argument, its value will be set and that
|
||||
@code{timestamp} will be returned. Otherwise, a new @code{timestamp}
|
||||
is created.
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex make-timestamp
|
||||
@defmac make-timestamp &key :day :sec :nsec
|
||||
|
||||
Expands to an expression that creates an instance of a
|
||||
@code{timestamp} exactly as specified.
|
||||
@end defmac
|
||||
|
||||
|
||||
@itindex clone-timestamp
|
||||
@defmac clone-timestamp timestamp
|
||||
|
||||
Expands to an expression that creates another copy of @var{timestamp}
|
||||
that is @code{timestamp=} to it.
|
||||
@end defmac
|
||||
|
||||
|
||||
@c ===================================================================
|
||||
@node Querying timestamp Objects
|
||||
@section Querying @code{timestamp} Objects
|
||||
|
||||
@itindex day-of
|
||||
@defun day-of timestamp
|
||||
|
||||
Returns the day component of @var{timestamp}. Although Naggum's paper
|
||||
specifies that the day should be a signed fixnum, it is left unbounded
|
||||
for flexibility reasons.
|
||||
@end defun
|
||||
|
||||
@itindex sec-of
|
||||
@defun sec-of timestamp
|
||||
|
||||
Returns the 'seconds' component of the time. Valid values for the
|
||||
seconds range from 0 to 86399.
|
||||
@end defun
|
||||
|
||||
@itindex nsec-of
|
||||
@defun nsec-of timestamp
|
||||
|
||||
Returns the 'microseconds' component of the time. Valid values for
|
||||
the nanoseconds range from 0 to 999999999.
|
||||
@end defun
|
||||
|
||||
@itindex timestamp-to-universal
|
||||
@defun timestamp-to-universal timestamp
|
||||
|
||||
This returns the date/time specified in @var{timestamp} encoded as
|
||||
the number of seconds since January 1st, 1900 12:00am UTC.
|
||||
@end defun
|
||||
|
||||
@itindex timestamp-to-unix
|
||||
@defun timestamp-to-unix timestamp
|
||||
|
||||
This returns the date/time specified in @var{timestamp} encoded as
|
||||
the number of seconds since January 1st, 1970 12:00am UTC. It
|
||||
corresponds with the time received from the POSIX call @code{time()}.
|
||||
@end defun
|
||||
|
||||
@itindex timestamp-subtimezone
|
||||
@defun timestamp-subtimezone timestamp timezone
|
||||
|
||||
Returns as multiple values the time zone applicable at the given time
|
||||
as the number of seconds east of UTC, a boolean daylight-saving-p, and
|
||||
the customary abbreviation of the timezone.
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex with-decoded-timestamp
|
||||
@defmac with-decoded-timestamp (&key nsec sec minute hour day month year day-of-week daylight-p timezone) timestamp &body body
|
||||
|
||||
This macro binds variables to the decoded elements of @var{timestamp}.
|
||||
The timezone argument is used for decoding the timestamp, and is not
|
||||
bound by the macro. The value of @var{day-of-week} starts from 0 which
|
||||
means Sunday.
|
||||
@end defmac
|
||||
|
||||
|
||||
@itindex decode-timestamp
|
||||
@defun decode-timestamp timestamp
|
||||
|
||||
Returns the decoded time as @code{(values ns ss mm hh day month
|
||||
year day-of-week daylight-saving-time-p timezone-offset timezone-abbreviation)}.
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex timestamp<
|
||||
@itindex timestamp<=
|
||||
@itindex timestamp>
|
||||
@itindex timestamp>=
|
||||
@itindex timestamp=
|
||||
@itindex timestamp/=
|
||||
@defun timestamp< time-a time-b
|
||||
@defunx timestamp<= time-a time-b
|
||||
@defunx timestamp> time-a time-b
|
||||
@defunx timestamp>= time-a time-b
|
||||
@defunx timestamp= time-a time-b
|
||||
@defunx timestamp/= time-a time-b
|
||||
|
||||
These comparison functions act like their string and char counterparts.
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex timestamp-minimum
|
||||
@defun timestamp-minimum timestamp &rest timestamps
|
||||
|
||||
Returns the earliest timestamp passed to it.
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex timestamp-maximum
|
||||
@defun timestamp-maximum timestamp &rest timestamps
|
||||
|
||||
Returns the latest timestamp passed to it.
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex timestamp-day-of-week
|
||||
@defun timestamp-day-of-week timestamp
|
||||
|
||||
This returns the index of the day of the week,
|
||||
starting at 0 which means Sunday.
|
||||
@quotation Note
|
||||
''Day of the week'' is ambigous and locale dependent.
|
||||
@end quotation
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex universal-to-timestamp
|
||||
@defun universal-to-timestamp timestamp
|
||||
|
||||
Returns the UNIVERSAL-TIME corresponding to @var{timestamp}.
|
||||
@quotation Note
|
||||
Subsecond precision is not preserved.
|
||||
@end quotation
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex timestamp-millennium
|
||||
@itindex timestamp-century
|
||||
@itindex timestamp-decade
|
||||
@defun timestamp-millennium timestamp &key timezone
|
||||
@defunx timestamp-century timestamp &key timezone
|
||||
@defunx timestamp-decade timestamp &key timezone
|
||||
|
||||
Returns the ordinal millennium, century or decade upon which the
|
||||
timestamp falls. Ordinal time values start at 1, so the
|
||||
(timestamp-century (now)) will return 21.
|
||||
|
||||
@end defun
|
||||
|
||||
@itindex timestamp-year
|
||||
@itindex timestamp-month
|
||||
@itindex timestamp-day
|
||||
@itindex timestamp-hour
|
||||
@itindex timestamp-minute
|
||||
@itindex timestamp-second
|
||||
@itindex timestamp-millisecond
|
||||
@itindex timestamp-microsecond
|
||||
@defun timestamp-year timestamp &key timezone
|
||||
@defunx timestamp-month timestamp &key timezone
|
||||
@defunx timestamp-day timestamp &key timezone
|
||||
@defunx timestamp-hour timestamp &key timezone
|
||||
@defunx timestamp-minute timestamp &key timezone
|
||||
@defunx timestamp-second timestamp &key timezone
|
||||
@defunx timestamp-millisecond timestamp &key timezone
|
||||
@defunx timestamp-microsecond timestamp &key timezone
|
||||
@defunx timestamp-microsecond timestamp &key timezone
|
||||
|
||||
Returns the decoded part of the timestamp.
|
||||
@end defun
|
||||
|
||||
|
||||
@c ===================================================================
|
||||
@node Manipulating Date and Time Values
|
||||
@section Manipulating Date and Time Values
|
||||
|
||||
@itindex timestamp+
|
||||
@itindex timestamp-
|
||||
@defun timestamp+ time amount unit
|
||||
@defunx timestamp- time amount unit
|
||||
|
||||
Add or subtract the @var{amount} to the @var{time} using the specified
|
||||
@var{unit}. @var{unit} may be one of ( @code{:nsec} @code{:sec}
|
||||
@code{:minute} @code{:hour} @code{:day} @code{:month} @code{:year}).
|
||||
The value of the parts of the timestamp of higher resolution than the
|
||||
UNIT will never be touched. If you want a precise number of seconds
|
||||
from a time, you should specify the offset in seconds.
|
||||
@end defun
|
||||
|
||||
@itindex timestamp-maximize-part
|
||||
@defun timestamp-maximize-part timestamp part &key offset timezone into
|
||||
|
||||
Returns a timestamp with its parts maximized up to @var{part}. @var{part} can be
|
||||
any of (:nsec :sec :min :hour :day :month). If @var{into} is specified, it
|
||||
will be modified and returned, otherwise a new timestamp will be
|
||||
created.
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex timestamp-minimize-part
|
||||
@defun timestamp-minimize-part timestamp part &key offset timezone into
|
||||
|
||||
Returns a timestamp with its parts minimized up to @var{part}. @var{part} can be
|
||||
any of (:nsec :sec :min :hour :day :month). If @var{into} is specified, it
|
||||
will be modified and returned, otherwise a new timestamp will be
|
||||
created.
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex adjust-timestamp
|
||||
@defmac adjust-timestamp timestamp &body changes
|
||||
|
||||
Alters various parts of @var{timestamp}, given a list of changes. The
|
||||
changes are in the format @code{(offset part value)} and @code{(set
|
||||
part value)}.
|
||||
|
||||
@lisp
|
||||
;; Return a new @code{timestamp} value that points to the Monday in
|
||||
;; the week of @code{(today)}
|
||||
(adjust-timestamp (today) (offset :day-of-week :monday))
|
||||
|
||||
;; Return a new @code{timestamp} value that points three days ahead from now
|
||||
(adjust-timestamp (today) (offset :day 3))
|
||||
@end lisp
|
||||
|
||||
Keep in mind that @code{adjust-timestamp} is not a mere setter for
|
||||
fields but instead it handles overflows and timezone conversions as
|
||||
expected. Also note that it's possible to specify multiple commands.
|
||||
|
||||
The list of possible places to manipulate are: @code{:nsec}
|
||||
@code{:sec} @code{:sec-of-day} @code{:minute} @code{:hour}
|
||||
@code{:day} @code{:day-of-month} @code{:month} @code{:year}.
|
||||
@end defmac
|
||||
|
||||
|
||||
@itindex adjust-timestamp!
|
||||
@defmac adjust-timestamp! timestamp &body changes
|
||||
|
||||
Just like @code{adjust-timestamp}, but instead of returning a freshly
|
||||
constructed value, it alters the provided @var{timestamp} value (and
|
||||
returns it).
|
||||
@end defmac
|
||||
|
||||
|
||||
@itindex timestamp-whole-year-difference
|
||||
@defun timestamp-whole-year-difference time-a time-b
|
||||
|
||||
Returns the number of whole years elapsed between @var{time-a} and @var{time-b}.
|
||||
@quotation Note
|
||||
This is useful for calculating anniversaries and birthdays.
|
||||
@end quotation
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex days-in-month
|
||||
@defun days-in-month month year
|
||||
|
||||
Returns the number of days in a given month of the specified year.
|
||||
@end defun
|
||||
|
||||
|
||||
@c ===================================================================
|
||||
@node Parsing and Formatting
|
||||
@section Parsing and Formatting
|
||||
|
||||
|
||||
@itindex +iso-8601-format+
|
||||
@defvr Constant +iso-8601-format+
|
||||
|
||||
The constant @var{+iso-8601-format+} is bound to a description of the ISO 8601 format. An output with this format will look like this: @samp{2008-03-01T19:42:34.608506+01:00}. This is the default format for the @code{format-timestring} function.
|
||||
|
||||
@end defvr
|
||||
|
||||
@itindex +asctime-format+
|
||||
@defvr Constant +asctime-format+
|
||||
|
||||
The constant @var{+asctime-format+} is bound to a format mirroring the output of the POSIX asctime() function. An output with this format will look like this: @samp{Sat Mar 1 19:42:34 2008}.
|
||||
|
||||
@end defvr
|
||||
|
||||
@itindex +rfc-1123-format+
|
||||
@defvr Constant +rfc-1123-format+
|
||||
|
||||
The constant @var{+rfc-1123-format+} is bound to a description of the format defined in RFC 1123 for Internet timestamps. An output with this format will look like this: @samp{Sat, 01 Mar 2008 19:42:34 -0500}.
|
||||
|
||||
@end defvr
|
||||
|
||||
@itindex +iso-week-date-format+
|
||||
@defvr Constant +iso-week-date-format+
|
||||
|
||||
The constant @var{+iso-week-date-format+} is bound to a description of the ISO 8601 Week Date format. An output with this format will look like this: @samp{2009-W53-5}.
|
||||
|
||||
@end defvr
|
||||
|
||||
@itindex parse-timestring
|
||||
@defun parse-timestring timestring &key (start 0) end (fail-on-error t) (offset 0)
|
||||
|
||||
Parses a timestring and returns the corresponding @code{timestamp}.
|
||||
Parsing begins at @var{start} and stops at the @var{end}
|
||||
position. If there are invalid characters within @code{timestring}
|
||||
and @var{fail-on-error} is @code{T}, then an @code{invalid-timestring}
|
||||
error is signaled, otherwise @code{NIL} is returned.
|
||||
|
||||
If there is no timezone specified in @code{timestring} then
|
||||
@var{offset} is used as the default timezone offset (in seconds).
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex format-timestring
|
||||
@defun format-timestring (destination timestamp &key (format +iso-8601-format+) (timezone *default-timezone*))
|
||||
|
||||
Constructs a string representation of TIMESTAMP according to FORMAT and returns it. If destination is @code{T}, the string is written to @code{*standard-output*}. If destination is a stream, the string is written to the stream.
|
||||
|
||||
FORMAT is a list containing one or more of strings, characters, and keywords. Strings and characters are output literally, while keywords are replaced by the values here:
|
||||
|
||||
@table @code
|
||||
@item :year
|
||||
*year
|
||||
@item :month
|
||||
*numeric month
|
||||
@item :day
|
||||
*day of month
|
||||
@item :weekday
|
||||
*numeric day of week, starting from 0 which means Sunday
|
||||
@item :hour
|
||||
*hour
|
||||
@item :min
|
||||
*minutes
|
||||
@item :sec
|
||||
*seconds
|
||||
@item :msec
|
||||
*milliseconds
|
||||
@item :usec
|
||||
*microseconds
|
||||
@item :nsec
|
||||
*nanoseconds
|
||||
@item :iso-week-year
|
||||
*year for ISO week date (can be different from regular calendar year)
|
||||
@item :iso-week-number
|
||||
*ISO week number (i.e. 1 through 53)
|
||||
@item :iso-week-day
|
||||
*ISO compatible weekday number (i.e. monday=1, sunday=7)
|
||||
@item :ordinal-day
|
||||
day of month as an ordinal (e.g. 1st, 23rd)
|
||||
@item :long-weekday
|
||||
long form of weekday (e.g. Sunday, Monday)
|
||||
@item :short-weekday
|
||||
short form of weekday (e.g. Sun, Mon)
|
||||
@item :minimal-weekday
|
||||
minimal form of weekday (e.g. Su, Mo)
|
||||
@item :short-year
|
||||
short form of year (last 2 digits, e.g. 41, 42 instead of 2041, 2042)
|
||||
@item :long-month
|
||||
long form of month (e.g. January, February)
|
||||
@item :short-month
|
||||
short form of month (e.g. Jan, Feb)
|
||||
@item :hour12
|
||||
hour on a 12-hour clock
|
||||
@item :ampm
|
||||
am/pm marker in lowercase
|
||||
@item :gmt-offset
|
||||
the gmt-offset of the time, in +00:00 form
|
||||
@item :gmt-offset-or-z
|
||||
like :gmt-offset, but is Z when UTC
|
||||
@item :gmt-offset-hhmm
|
||||
like :gmt-offset, but in +0000 form
|
||||
@item :timezone
|
||||
timezone abbrevation for the time
|
||||
@end table
|
||||
|
||||
Elements marked by * can be placed in a list in the form:
|
||||
@lisp
|
||||
(:keyword padding &optional (padchar #\0))
|
||||
@end lisp
|
||||
The string representation of the value will be padded with the padchar.
|
||||
|
||||
You can see examples by examining the values in @var{+iso-8601-format+}, @var{+asctime-format+}, and @var{+rfc-1123-format+}.
|
||||
|
||||
Produces on @var{stream} the timestring corresponding to the @var{timestamp} with
|
||||
the given options. If @var{stream} is @code{nil}, only returns a string containing what
|
||||
would have been the output. If @var{stream} is @code{t}, prints the string to
|
||||
@var{*standard-output*}.
|
||||
|
||||
Example output:
|
||||
@lisp
|
||||
LOCAL-TIME> (format-timestring nil (now))
|
||||
"2008-03-01T19:42:34.608506+01:00"
|
||||
@end lisp
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex format-rfc3339-timestring
|
||||
@defun format-rfc3339-timestring (destination timestamp &key omit-date-part omit-time-part omit-timezone-part (use-zulu t))
|
||||
|
||||
Formats the time like format-timestring, but in RFC 3339 format. The options control valid options in the RFC.
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex format-rfc1123-timestring
|
||||
@defun format-rfc1123-timestring (destination timestamp &key (timezone *default-timezone*))
|
||||
|
||||
Formats the time like format-timestring, but in RFC 1123 format.
|
||||
@end defun
|
||||
|
||||
@c ===================================================================
|
||||
@node Clocks
|
||||
@section Clocks
|
||||
|
||||
@defvr Default *clock*
|
||||
|
||||
The *clock* special variable and the following generic functions are
|
||||
exposed so that applications may re-define the current time or date as
|
||||
required. This can be used for testing or to support alternate clocks.
|
||||
|
||||
The currently supported values are:
|
||||
|
||||
@itemize
|
||||
@item @code{t} - Use the standard system clock with no adjustments
|
||||
@item @code{leap-second-adjusted} - The system clock, adjusted for leap seconds using the information in *default-timezone*.
|
||||
@end itemize
|
||||
|
||||
@end defvr
|
||||
|
||||
@defun clock-now (clock)
|
||||
|
||||
Specialize this generic function to re-define the present moment
|
||||
@end defun
|
||||
|
||||
@defun clock-today (clock)
|
||||
|
||||
Specialize this generic function to re-define the present day
|
||||
@end defun
|
||||
|
||||
@c ===================================================================
|
||||
@node Other Features
|
||||
@chapter Other Features
|
||||
|
||||
@section Reader Macros
|
||||
|
||||
@itindex enable-read-macros
|
||||
@defun enable-read-macros
|
||||
|
||||
Adds @@TIMESTRING and #@@UNIVERSAL-TIME as reader macros.
|
||||
@end defun
|
||||
|
||||
|
||||
@section Support for non-Gregorian Calendars
|
||||
|
||||
@itindex astronomical-julian-date
|
||||
@defun astronomical-julian-date timestamp
|
||||
|
||||
Returns the julian date of the date portion of @var{timestamp}.
|
||||
@end defun
|
||||
|
||||
|
||||
@itindex modified-julian-date
|
||||
@defun astronomical-julian-date timestamp
|
||||
|
||||
Returns the modified julian date of the date portion of @var{timestamp}.
|
||||
@end defun
|
||||
|
||||
@c ===================================================================
|
||||
@node References
|
||||
@chapter References
|
||||
|
||||
@itemize
|
||||
|
||||
@item
|
||||
[NaggumPaper] Erik Naggum. @emph{The Long Painful History of Time}
|
||||
@url{http://naggum.no/lugm-time.html}, 1999.
|
||||
|
||||
@end itemize
|
||||
|
||||
|
||||
@c ===================================================================
|
||||
@node Comprehensive Index
|
||||
@unnumbered Index
|
||||
@printindex cp
|
||||
|
||||
@bye
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
body {font-family: century schoolbook, serif;
|
||||
line-height: 1.3;
|
||||
padding-left: 5em; padding-right: 1em;
|
||||
padding-bottom: 1em; max-width: 60em;}
|
||||
table {border-collapse: collapse}
|
||||
span.roman { font-family: century schoolbook, serif; font-weight: normal; }
|
||||
h1, h2, h3, h4, h5, h6 {font-family: Helvetica, sans-serif}
|
||||
/*h4 {padding-top: 0.75em;}*/
|
||||
dfn {font-family: inherit; font-variant: italic; font-weight: bolder }
|
||||
kbd {font-family: monospace; text-decoration: underline}
|
||||
/*var {font-family: Helvetica, sans-serif; font-variant: slanted}*/
|
||||
var {font-variant: slanted;}
|
||||
td {padding-right: 1em; padding-left: 1em}
|
||||
sub {font-size: smaller}
|
||||
.node {padding: 0; margin: 0}
|
||||
|
||||
.lisp { font-family: monospace;
|
||||
background-color: #F4F4F4; border: 1px solid #AAA;
|
||||
padding-top: 0.5em; padding-bottom: 0.5em; }
|
||||
|
||||
/* coloring */
|
||||
|
||||
.lisp-bg { background-color: #F4F4F4 ; color: black; }
|
||||
.lisp-bg:hover { background-color: #F4F4F4 ; color: black; }
|
||||
|
||||
.symbol { font-weight: bold; color: #770055; background-color : transparent; border: 0px; margin: 0px;}
|
||||
a.symbol:link { font-weight: bold; color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; }
|
||||
a.symbol:active { font-weight: bold; color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; }
|
||||
a.symbol:visited { font-weight: bold; color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; }
|
||||
a.symbol:hover { font-weight: bold; color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; }
|
||||
.special { font-weight: bold; color: #FF5000; background-color: inherit; }
|
||||
.keyword { font-weight: bold; color: #770000; background-color: inherit; }
|
||||
.comment { font-weight: normal; color: #007777; background-color: inherit; }
|
||||
.string { font-weight: bold; color: #777777; background-color: inherit; }
|
||||
.character { font-weight: bold; color: #0055AA; background-color: inherit; }
|
||||
.syntaxerror { font-weight: bold; color: #FF0000; background-color: inherit; }
|
||||
span.paren1 { font-weight: bold; color: #777777; }
|
||||
span.paren1:hover { color: #777777; background-color: #BAFFFF; }
|
||||
span.paren2 { color: #777777; }
|
||||
span.paren2:hover { color: #777777; background-color: #FFCACA; }
|
||||
span.paren3 { color: #777777; }
|
||||
span.paren3:hover { color: #777777; background-color: #FFFFBA; }
|
||||
span.paren4 { color: #777777; }
|
||||
span.paren4:hover { color: #777777; background-color: #CACAFF; }
|
||||
span.paren5 { color: #777777; }
|
||||
span.paren5:hover { color: #777777; background-color: #CAFFCA; }
|
||||
span.paren6 { color: #777777; }
|
||||
span.paren6:hover { color: #777777; background-color: #FFBAFF; }
|
||||
Loading…
Add table
Add a link
Reference in a new issue