Я склонен использовать константу по мере возможности. (Или другое соответствующее ключевое слово для выходного языка.) Я делаю это просто, потому что это позволяет компилятору делать дополнительную оптимизацию, которую это не было бы в состоянии сделать иначе. Так как я понятия не имею, какова эта оптимизация может быть, я всегда делаю это, даже там, где это кажется глупым.
Кто знает, компилятор мог бы очень хорошо видеть параметр, передаваемый по значению константы и сказать, "Эй, эта функция не изменяет его так или иначе, таким образом, я могу передать ссылкой и сохранить некоторые такты". Я не думаю, что это когда-либо делало бы такую вещь, так как это изменяет функциональную подпись, но это высказывает мнение. Возможно, это делает некоторое различное управление стеком или что-то... Точка, я не знаю, но я действительно знаю попытку быть более умным, чем компилятор только приводит ко мне пристыживаемый.
C++ имеет некоторый дополнительный багаж с идеей правильности константы, таким образом, это становится еще более важным.
isoformat работает с экземплярами datetime
без ограничения диапазона:
>>> import datetime
>>> x=datetime.datetime(1865, 7, 2, 9, 30, 21)
>>> x.isoformat()
'1865-07-02T09:30:21'
Если вам нужна строка другого формата, это не так слишком сложно нарезать, нарезать кубиками и преобразовать части строки, которую вы получаете из isoformat
, который очень согласован ( YYYY-MM-DDTHH: MM: SS.mmmmmm
, с точкой и следующие микросекунды опускаются, если микросекунды равны нулю).
Это из источника matplotlib . Может стать хорошей отправной точкой для создания собственного.
def strftime(self, dt, fmt):
fmt = self.illegal_s.sub(r"\1", fmt)
fmt = fmt.replace("%s", "s")
if dt.year > 1900:
return cbook.unicode_safe(dt.strftime(fmt))
year = dt.year
# For every non-leap year century, advance by
# 6 years to get into the 28-year repeat cycle
delta = 2000 - year
off = 6*(delta // 100 + delta // 400)
year = year + off
# Move to around the year 2000
year = year + ((2000 - year)//28)*28
timetuple = dt.timetuple()
s1 = time.strftime(fmt, (year,) + timetuple[1:])
sites1 = self._findall(s1, str(year))
s2 = time.strftime(fmt, (year+28,) + timetuple[1:])
sites2 = self._findall(s2, str(year+28))
sites = []
for site in sites1:
if site in sites2:
sites.append(site)
s = s1
syear = "%4d" % (dt.year,)
for site in sites:
s = s[:site] + syear + s[site+4:]
return cbook.unicode_safe(s)
Это «особенность» библиотеки ctime (UTF). Также у Вас может быть проблема выше 2038.
mxDateTime
can handle arbitrary dates. Python's time
and datetime
modules use UNIX timestamps internally, that's why they have limited range.
In [5]: mx.DateTime.DateTime(1899)
Out[5]: <mx.DateTime.DateTime object for '1899-01-01 00:00:00.00' at 154a960>
In [6]: DateTime.DateTime(1899).Format('%Y-%m-%d')
Out[6]: 1899-01-01
The documentation seems pretty clear about this:
The exact range of years for which
strftime()
works also varies across platforms. Regardless of platform, years before 1900 cannot be used.
So there isn't going to be a solution that uses strftime()
. Luckily, it's pretty straightforward to do this "by hand":
>>> "%02d-%02d-%02d %02d:%02d" % (d.year,d.month,d.day,d.hour,d.minute)
'1899-01-01 00:00'