2016-01-05 2 views
1

У меня есть функция, которая, как предполагается построить заголовок для календаря, как так:рендеринг текста Календарь

' Sun Mon Tue Wed Thu Fri Sat '

Он принимает isoweekday (один из "#Monday 1, 2, 3, 4 , 5, 6, 7 '# Суббота').

Вот код:

@staticmethod 
def _isoweekday_to_str(isoweekday): 
    isoweekday = isoweekday - 1 
    isoweekday = str(isoweekday) 
    x = datetime.strptime(isoweekday, '%w') 
    return x.strftime('%a') 

TEXT_CAL_MONTH_WEEK_HEADER = "" 

iter_isoweekday = week_start 
for _ in range(0,7): 
    TEXT_CAL_MONTH_WEEK_HEADER += self._isoweekday_to_str(iter_isoweekday).rjust(TEXT_CAL_CELL_WIDTH, " ") 

      if iter_isoweekday != 7: 
       iter_isoweekday += 1 
      else: 
       iter_isoweekday = 1 

Выход я получаю при переходе в 4, как в начале недели, это:

' Mon Mon Mon Mon Mon Mon Mon '

должно быть:

' Thu Fri Sat Sun Mon Tue Wed '

Я действительно, действительно не что происходит. Я думаю, что это как-то связано с тем, как назначаются переменные, строковая мутация или библиотека datetime.

UPDATE: похоже, что проблема datetime.strptime. Независимо от того, что я прохожу, я получаю datetime (1900, 1, 1, 0, 0) назад ... который, как вы догадались, был в понедельник.

Помощь?

+0

'datetime.strptime (isoweekday, '% ш')' возвращает 'datetime.datetime (1900, 1, 1, 0, 0)' нет вопрос какой 'isoweekday' есть. –

ответ

1

Вы можете получить локализованные дни недели от calendar module:

>>> import calendar 
>>> list(calendar.day_name) 
['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] 

или сокращенных названий, используя calendar.day_abbr:

>>> ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] 

См the documentation, если п другие локали.

Очевидно, что модуль может производить целые календари:

>>> print calendar.TextCalendar().formatmonth(2016, 1) 
    January 2016 
Mo Tu We Th Fr Sa Su 
      1 2 3 
4 5 6 7 8 9 10 
11 12 13 14 15 16 17 
18 19 20 21 22 23 24 
25 26 27 28 29 30 31 
+0

Я смотрел на модуль календаря некоторое время назад на самом деле ... я понимаю, что он не делает хорошую работу по созданию «пользовательских» календарей , он просто в основном производит календари всего месяца/года, но не между диапазонами. Это верно? – NotAnAmbiTurner

+1

Не знаю. Прочтите документацию. Вы можете получать массивы всех недельных дней в течение месяца и отформатировать их так, как вам нравится. –

+0

Я читал документы, и это то, что я получил от этого - мне было интересно, если у вас есть более подробная информация. – NotAnAmbiTurner

1

Я не уверен, почему вы хотите сделать это таким образом, но вам нужна фактическая дата для перехода к strptime, а не к isoweekday. Например,

from datetime import datetime 
TEXT_CAL_CELL_WIDTH = 5 
def _isoweekday_to_str(isoweekday): 
    isoweekday = '1900-01-{:02d}'.format(isoweekday) 
    x = datetime.strptime(isoweekday, '%Y-%m-%d') 
    return x.strftime('%a') 

TEXT_CAL_MONTH_WEEK_HEADER = "" 

week_start = 4 
iter_isoweekday = week_start 
for _ in range(0,7): 
    TEXT_CAL_MONTH_WEEK_HEADER += _isoweekday_to_str(iter_isoweekday).rjust(TEXT_CAL_CELL_WIDTH, " ") 
    if iter_isoweekday != 7: 
     iter_isoweekday += 1 
    else: 
     iter_isoweekday = 1 
print(TEXT_CAL_MONTH_WEEK_HEADER) 

Выход:

Thu Fri Sat Sun Mon Tue Wed 

(Это работает, потому что 01.01.1900 был понедельник).

Но почему бы не сделать что-то подобное со словарем имен дня:

day_names = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] 
def weekday_header(week_start): 
    header = ''.join(['{:4s}'.format(day_names[(day_number+week_start) % 7]) 
        for day_number in range(7)]) 
    return header 

print(weekday_header(4)) 
+0

Это было из-за локализации, с которой другой ответчик также помог :) – NotAnAmbiTurner

 Смежные вопросы

  • Нет связанных вопросов^_^