Там какой-либо путь состоит в том, чтобы использовать подобную strftime функцию для дат до 1900 в Python?

Я склонен использовать константу по мере возможности. (Или другое соответствующее ключевое слово для выходного языка.) Я делаю это просто, потому что это позволяет компилятору делать дополнительную оптимизацию, которую это не было бы в состоянии сделать иначе. Так как я понятия не имею, какова эта оптимизация может быть, я всегда делаю это, даже там, где это кажется глупым.

Кто знает, компилятор мог бы очень хорошо видеть параметр, передаваемый по значению константы и сказать, "Эй, эта функция не изменяет его так или иначе, таким образом, я могу передать ссылкой и сохранить некоторые такты". Я не думаю, что это когда-либо делало бы такую вещь, так как это изменяет функциональную подпись, но это высказывает мнение. Возможно, это делает некоторое различное управление стеком или что-то... Точка, я не знаю, но я действительно знаю попытку быть более умным, чем компилятор только приводит ко мне пристыживаемый.

C++ имеет некоторый дополнительный багаж с идеей правильности константы, таким образом, это становится еще более важным.

19
задан Jason Baker 29 October 2009 в 16:28
поделиться

5 ответов

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 , с точкой и следующие микросекунды опускаются, если микросекунды равны нулю).

15
ответ дан 30 November 2019 в 03:53
поделиться

Это из источника 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)
3
ответ дан 30 November 2019 в 03:53
поделиться

Это «особенность» библиотеки ctime (UTF). Также у Вас может быть проблема выше 2038.

1
ответ дан 30 November 2019 в 03:53
поделиться

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
3
ответ дан 30 November 2019 в 03:53
поделиться

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'
11
ответ дан 30 November 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: