annotate babel/dates.py @ 18:77a68f88f6bc

Started documentation for date formatting, plus some code tweaks in that area.
author cmlenz
date Thu, 31 May 2007 17:10:47 +0000
parents ed154241c08d
children c0c92d11f1ab
rev   line source
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
2 #
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2007 Edgewall Software
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
4 # All rights reserved.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
5 #
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
6 # This software is licensed as described in the file COPYING, which
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
7 # you should have received as part of this distribution. The terms
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
8 # are also available at http://babel.edgewall.org/wiki/License.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
9 #
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
10 # This software consists of voluntary contributions made by many
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
11 # individuals. For the exact contribution history, see the revision
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
12 # history and logs, available at http://babel.edgewall.org/log/.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
13
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
14 """Locale dependent formatting and parsing of dates and times.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
15
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
16 The default locale for the functions in this module is determined by the
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
17 following environment variables, in that order:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
18
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
19 * ``LC_TIME``,
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
20 * ``LC_ALL``, and
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
21 * ``LANG``
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
22 """
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
23
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
24 from datetime import date, datetime, time
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
25
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
26 from babel.core import Locale
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
27 from babel.util import default_locale
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
28
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
29 __all__ = ['format_date', 'format_datetime', 'format_time', 'parse_date',
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
30 'parse_datetime', 'parse_time']
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
31 __docformat__ = 'restructuredtext en'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
32
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
33 LC_TIME = default_locale('LC_TIME')
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
34
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
35 def get_period_names(locale=LC_TIME):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
36 """Return the names for day periods (AM/PM) used by the locale.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
37
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
38 >>> get_period_names(locale='en_US')['am']
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
39 u'AM'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
40
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
41 :param locale: the `Locale` object, or a locale string
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
42 :return: the dictionary of period names
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
43 :rtype: `dict`
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
44 """
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
45 return Locale.parse(locale).periods
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
46
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
47 def get_day_names(width='wide', context='format', locale=LC_TIME):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
48 """Return the day names used by the locale for the specified format.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
49
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
50 >>> get_day_names('wide', locale='en_US')[1]
15
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
51 u'Tuesday'
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
52 >>> get_day_names('abbreviated', locale='es')[1]
15
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
53 u'mar'
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
54 >>> get_day_names('narrow', context='stand-alone', locale='de_DE')[1]
15
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
55 u'D'
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
56
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
57 :param width: the width to use, one of "wide", "abbreviated", or "narrow"
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
58 :param context: the context, either "format" or "stand-alone"
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
59 :param locale: the `Locale` object, or a locale string
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
60 :return: the dictionary of day names
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
61 :rtype: `dict`
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
62 """
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
63 return Locale.parse(locale).days[context][width]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
64
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
65 def get_month_names(width='wide', context='format', locale=LC_TIME):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
66 """Return the month names used by the locale for the specified format.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
67
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
68 >>> get_month_names('wide', locale='en_US')[1]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
69 u'January'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
70 >>> get_month_names('abbreviated', locale='es')[1]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
71 u'ene'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
72 >>> get_month_names('narrow', context='stand-alone', locale='de_DE')[1]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
73 u'J'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
74
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
75 :param width: the width to use, one of "wide", "abbreviated", or "narrow"
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
76 :param context: the context, either "format" or "stand-alone"
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
77 :param locale: the `Locale` object, or a locale string
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
78 :return: the dictionary of month names
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
79 :rtype: `dict`
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
80 """
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
81 return Locale.parse(locale).months[context][width]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
82
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
83 def get_quarter_names(width='wide', context='format', locale=LC_TIME):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
84 """Return the quarter names used by the locale for the specified format.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
85
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
86 >>> get_quarter_names('wide', locale='en_US')[1]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
87 u'1st quarter'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
88 >>> get_quarter_names('abbreviated', locale='de_DE')[1]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
89 u'Q1'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
90
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
91 :param width: the width to use, one of "wide", "abbreviated", or "narrow"
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
92 :param context: the context, either "format" or "stand-alone"
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
93 :param locale: the `Locale` object, or a locale string
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
94 :return: the dictionary of quarter names
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
95 :rtype: `dict`
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
96 """
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
97 return Locale.parse(locale).quarters[context][width]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
98
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
99 def get_era_names(width='wide', locale=LC_TIME):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
100 """Return the era names used by the locale for the specified format.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
101
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
102 >>> get_era_names('wide', locale='en_US')[1]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
103 u'Anno Domini'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
104 >>> get_era_names('abbreviated', locale='de_DE')[1]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
105 u'n. Chr.'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
106
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
107 :param width: the width to use, either "wide" or "abbreviated"
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
108 :param locale: the `Locale` object, or a locale string
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
109 :return: the dictionary of era names
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
110 :rtype: `dict`
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
111 """
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
112 return Locale.parse(locale).eras[width]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
113
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
114 def get_date_format(format='medium', locale=LC_TIME):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
115 """Return the date formatting patterns used by the locale for the specified
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
116 format.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
117
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
118 >>> get_date_format(locale='en_US')
12
a2c54ef107c2 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 8
diff changeset
119 <DateTimePattern u'MMM d, yyyy'>
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
120 >>> get_date_format('full', locale='de_DE')
12
a2c54ef107c2 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 8
diff changeset
121 <DateTimePattern u'EEEE, d. MMMM yyyy'>
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
122
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
123 :param format: the format to use, one of "full", "long", "medium", or
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
124 "short"
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
125 :param locale: the `Locale` object, or a locale string
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
126 :return: the date format pattern
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
127 :rtype: `dict`
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
128 """
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
129 return Locale.parse(locale).date_formats[format]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
130
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
131 def get_time_format(format='medium', locale=LC_TIME):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
132 """Return the time formatting patterns used by the locale for the specified
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
133 format.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
134
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
135 >>> get_time_format(locale='en_US')
12
a2c54ef107c2 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 8
diff changeset
136 <DateTimePattern u'h:mm:ss a'>
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
137 >>> get_time_format('full', locale='de_DE')
12
a2c54ef107c2 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 8
diff changeset
138 <DateTimePattern u"H:mm' Uhr 'z">
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
139
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
140 :param format: the format to use, one of "full", "long", "medium", or
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
141 "short"
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
142 :param locale: the `Locale` object, or a locale string
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
143 :return: the time format pattern
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
144 :rtype: `dict`
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
145 """
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
146 return Locale.parse(locale).time_formats[format]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
147
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
148 def format_date(date, format='medium', locale=LC_TIME):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
149 """Returns a date formatted according to the given pattern.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
150
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
151 >>> d = date(2007, 04, 01)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
152 >>> format_date(d, locale='en_US')
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
153 u'Apr 1, 2007'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
154 >>> format_date(d, format='full', locale='de_DE')
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
155 u'Sonntag, 1. April 2007'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
156
16
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
157 If you don't want to use the locale default formats, you can specify a
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
158 custom date pattern:
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
159
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
160 >>> format_time(d, "EEE, MMM d, ''yy", locale='en')
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
161 u"Sun, Apr 1, '07"
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
162
18
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
163 If the pattern contains time fields, an `AttributeError` will be raised
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
164 when trying to apply the formatting:
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
165
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
166 >>> format_date(d, "yyyy-MM-dd HH:mm", locale='en_US')
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
167 Traceback (most recent call last):
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
168 ...
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
169 AttributeError: 'datetime.date' object has no attribute 'hour'
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
170
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
171 This is also true if the value of ``date`` parameter is a ``datetime``
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
172 object, as this function automatically converts it to a ``date``::
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
173
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
174 >>> dt = datetime(2007, 04, 01, 15, 30)
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
175 >>> format_date(dt, "yyyy-MM-dd HH:mm", locale='en_US')
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
176 Traceback (most recent call last):
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
177 ...
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
178 AttributeError: 'datetime.date' object has no attribute 'hour'
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
179
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
180 :param date: the ``date`` object
16
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
181 :param format: one of "full", "long", "medium", or "short", or a custom
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
182 date/time pattern
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
183 :param locale: a `Locale` object or a locale string
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
184 :rtype: `unicode`
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
185 """
18
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
186 if isinstance(date, datetime):
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
187 date = date.date()
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
188 locale = Locale.parse(locale)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
189 if format in ('full', 'long', 'medium', 'short'):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
190 format = get_date_format(format, locale=locale)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
191 pattern = parse_pattern(format)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
192 return parse_pattern(format).apply(date, locale)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
193
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
194 def format_datetime(datetime, format='medium', locale=LC_TIME):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
195 """Returns a date formatted according to the given pattern.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
196
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
197 :param datetime: the ``date`` object
16
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
198 :param format: one of "full", "long", "medium", or "short", or a custom
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
199 date/time pattern
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
200 :param locale: a `Locale` object or a locale string
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
201 :rtype: `unicode`
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
202 """
18
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
203 locale = Locale.parse(locale)
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
204 if format in ('full', 'long', 'medium', 'short'):
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
205 raise NotImplementedError
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
206 pattern = parse_pattern(format)
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
207 return parse_pattern(format).apply(datetime, locale)
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
208
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
209 def format_time(time, format='medium', locale=LC_TIME):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
210 """Returns a time formatted according to the given pattern.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
211
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
212 >>> t = time(15, 30)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
213 >>> format_time(t, locale='en_US')
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
214 u'3:30:00 PM'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
215 >>> format_time(t, format='short', locale='de_DE')
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
216 u'15:30'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
217
16
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
218 If you don't want to use the locale default formats, you can specify a
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
219 custom time pattern:
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
220
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
221 >>> format_time(t, "hh 'o''clock' a", locale='en')
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
222 u"03 o'clock PM"
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
223
18
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
224 If the pattern contains date fields, an `AttributeError` will be raised
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
225 when trying to apply the formatting:
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
226
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
227 >>> format_time(t, "yyyy-MM-dd HH:mm", locale='en_US')
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
228 Traceback (most recent call last):
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
229 ...
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
230 AttributeError: 'datetime.time' object has no attribute 'year'
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
231
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
232 This is also true if the value of ``time`` parameter is a ``datetime``
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
233 object, as this function automatically converts it to a ``time``::
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
234
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
235 >>> dt = datetime(2007, 04, 01, 15, 30)
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
236 >>> format_time(dt, "yyyy-MM-dd HH:mm", locale='en_US')
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
237 Traceback (most recent call last):
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
238 ...
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
239 AttributeError: 'datetime.time' object has no attribute 'year'
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
240
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
241 :param time: the ``time`` object
16
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
242 :param format: one of "full", "long", "medium", or "short", or a custom
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
243 date/time pattern
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
244 :param locale: a `Locale` object or a locale string
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
245 :rtype: `unicode`
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
246 """
18
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
247 if isinstance(time, (int, long)):
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
248 time = datetime.fromtimestamp(time).time()
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
249 elif isinstance(time, datetime):
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
250 time = time.time()
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
251 locale = Locale.parse(locale)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
252 if format in ('full', 'long', 'medium', 'short'):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
253 format = get_time_format(format, locale=locale)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
254 return parse_pattern(format).apply(time, locale)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
255
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
256 def parse_date(string, locale=LC_TIME):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
257 raise NotImplementedError
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
258
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
259 def parse_datetime(string, locale=LC_TIME):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
260 raise NotImplementedError
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
261
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
262 def parse_time(string, locale=LC_TIME):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
263 raise NotImplementedError
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
264
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
265
12
a2c54ef107c2 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 8
diff changeset
266 class DateTimePattern(object):
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
267
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
268 def __init__(self, pattern, format):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
269 self.pattern = pattern
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
270 self.format = format
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
271
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
272 def __repr__(self):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
273 return '<%s %r>' % (type(self).__name__, self.pattern)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
274
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
275 def __unicode__(self):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
276 return self.pattern
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
277
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
278 def __mod__(self, other):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
279 assert type(other) is DateTimeFormat
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
280 return self.format % other
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
281
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
282 def apply(self, datetime, locale):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
283 return self % DateTimeFormat(datetime, locale)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
284
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
285
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
286 class DateTimeFormat(object):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
287
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
288 def __init__(self, value, locale):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
289 assert isinstance(value, (date, datetime, time))
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
290 self.value = value
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
291 self.locale = Locale.parse(locale)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
292
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
293 def __getitem__(self, name):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
294 # TODO: a number of fields missing here
15
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
295 char = name[0]
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
296 num = len(name)
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
297 if char == 'G':
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
298 return self.format_era(char, num)
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
299 elif char in ('y', 'Y'):
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
300 return self.format_year(char, num)
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
301 elif char in ('Q', 'q'):
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
302 return self.format_quarter(char, num)
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
303 elif char in ('M', 'L'):
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
304 return self.format_month(char, num)
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
305 elif char == 'd':
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
306 return self.format(self.value.day, num)
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
307 elif char in ('E', 'e', 'c'):
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
308 return self.format_weekday(char, num)
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
309 elif char == 'a':
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
310 return self.format_period(char)
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
311 elif char == 'h':
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
312 return self.format(self.value.hour % 12, num)
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
313 elif char == 'H':
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
314 return self.format(self.value.hour, num)
18
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
315 elif char == 'K':
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
316 return self.format(self.value.hour % 12 - 1, num)
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
317 elif char == 'k':
77a68f88f6bc Started documentation for date formatting, plus some code tweaks in that area.
cmlenz
parents: 16
diff changeset
318 return self.format(self.value.hour + 1, num)
15
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
319 elif char == 'm':
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
320 return self.format(self.value.minute, num)
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
321 elif char == 's':
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
322 return self.format(self.value.second, num)
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
323 else:
15
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
324 raise KeyError('Unsupported date/time field %r' % char)
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
325
15
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
326 def format_era(self, char, num):
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
327 width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[max(3, num)]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
328 era = int(self.value.year >= 0)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
329 return get_era_names(width, self.locale)[era]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
330
15
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
331 def format_year(self, char, num):
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
332 if char.islower():
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
333 value = self.value.year
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
334 else:
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
335 value = self.value.isocalendar()[0]
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
336 year = self.format(value, num)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
337 if num == 2:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
338 year = year[-2:]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
339 return year
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
340
15
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
341 def format_month(self, char, num):
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
342 if num <= 2:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
343 return ('%%0%dd' % num) % self.value.month
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
344 width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[num]
15
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
345 context = {3: 'format', 4: 'format', 5: 'stand-alone'}[num]
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
346 return get_month_names(width, context, self.locale)[self.value.month]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
347
15
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
348 def format_weekday(self, char, num):
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
349 if num < 3:
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
350 if char.islower():
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
351 value = 7 - self.locale.first_week_day + self.value.weekday()
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
352 return self.format(value % 7 + 1, num)
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
353 num = 3
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
354 weekday = self.value.weekday()
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
355 width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[num]
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
356 context = {3: 'format', 4: 'format', 5: 'stand-alone'}[num]
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
357 return get_day_names(width, context, self.locale)[weekday]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
358
15
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
359 def format_period(self, char):
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
360 period = {0: 'am', 1: 'pm'}[int(self.value.hour > 12)]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
361 return get_period_names(locale=self.locale)[period]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
362
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
363 def format(self, value, length):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
364 return ('%%0%dd' % length) % value
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
365
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
366
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
367 PATTERN_CHARS = {
15
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
368 'G': [1, 2, 3, 4, 5], # era
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
369 'y': None, 'Y': None, 'u': None, # year
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
370 'Q': [1, 2, 3, 4], 'q': [1, 2, 3, 4], # quarter
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
371 'M': [1, 2, 3, 4, 5], 'L': [1, 2, 3, 4, 5], # month
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
372 'w': [1, 2], 'W': [1], # week
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
373 'd': [1, 2], 'D': [1, 2, 3], 'F': [1], 'g': None, # day
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
374 'E': [1, 2, 3, 4, 5], 'e': [1, 2, 3, 4, 5], 'c': [1, 3, 4, 5], # week day
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
375 'a': [1], # period
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
376 'h': [1, 2], 'H': [1, 2], 'K': [1, 2], 'k': [1, 2], # hour
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
377 'm': [1, 2], # minute
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
378 's': [1, 2], 'S': None, 'A': None, # second
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
379 'z': [1, 2, 3, 4], 'Z': [1, 2, 3, 4], 'v': [1, 4] # zone
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
380 }
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
381
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
382 def parse_pattern(pattern):
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
383 """Parse date, time, and datetime format patterns.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
384
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
385 >>> parse_pattern("MMMMd").format
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
386 u'%(MMMM)s%(d)s'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
387 >>> parse_pattern("MMM d, yyyy").format
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
388 u'%(MMM)s %(d)s, %(yyyy)s'
16
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
389
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
390 Pattern can contain literal strings in single quotes:
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
391
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
392 >>> parse_pattern("H:mm' Uhr 'z").format
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
393 u'%(H)s:%(mm)s Uhr %(z)s'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
394
16
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
395 An actual single quote can be used by using two adjacent single quote
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
396 characters:
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
397
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
398 >>> parse_pattern("hh' o''clock'").format
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
399 u"%(hh)s o'clock"
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
400
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
401 :param pattern: the formatting pattern to parse
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
402 """
12
a2c54ef107c2 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 8
diff changeset
403 if type(pattern) is DateTimePattern:
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
404 return pattern
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
405
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
406 result = []
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
407 quotebuf = None
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
408 charbuf = []
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
409 fieldchar = ['']
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
410 fieldnum = [0]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
411
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
412 def append_chars():
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
413 result.append(''.join(charbuf).replace('%', '%%'))
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
414 del charbuf[:]
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
415
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
416 def append_field():
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
417 limit = PATTERN_CHARS[fieldchar[0]]
15
76985c08a339 Minor date formatting improvements.
cmlenz
parents: 12
diff changeset
418 if limit and fieldnum[0] not in limit:
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
419 raise ValueError('Invalid length for field: %r'
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
420 % (fieldchar[0] * fieldnum[0]))
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
421 result.append('%%(%s)s' % (fieldchar[0] * fieldnum[0]))
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
422 fieldchar[0] = ''
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
423 fieldnum[0] = 0
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
424
16
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
425 for idx, char in enumerate(pattern.replace("''", '\0')):
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
426 if quotebuf is None:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
427 if char == "'": # quote started
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
428 if fieldchar[0]:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
429 append_field()
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
430 elif charbuf:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
431 append_chars()
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
432 quotebuf = []
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
433 elif char in PATTERN_CHARS:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
434 if charbuf:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
435 append_chars()
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
436 if char == fieldchar[0]:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
437 fieldnum[0] += 1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
438 else:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
439 if fieldchar[0]:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
440 append_field()
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
441 fieldchar[0] = char
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
442 fieldnum[0] = 1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
443 else:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
444 if fieldchar[0]:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
445 append_field()
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
446 charbuf.append(char)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
447
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
448 elif quotebuf is not None:
16
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
449 if char == "'": # end of quote
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
450 charbuf.extend(quotebuf)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
451 quotebuf = None
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
452 else: # inside quote
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
453 quotebuf.append(char)
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
454
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
455 if fieldchar[0]:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
456 append_field()
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
457 elif charbuf:
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
458 append_chars()
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
459
16
ed154241c08d Handle escape chars in datetime patterns.
cmlenz
parents: 15
diff changeset
460 return DateTimePattern(pattern, u''.join(result).replace('\0', "'"))
Copyright (C) 2012-2017 Edgewall Software