В направляющих, время дисплея между двумя датами на английском языке

У меня есть другой пример кода, который может помочь, используя python3, pathlib и zipfile. Должно работать в любой ОС.

from pathlib import Path
import zipfile
from datetime import datetime

DATE_FORMAT = '%y%m%d'


def date_str():
    """returns the today string year, month, day"""
    return '{}'.format(datetime.now().strftime(DATE_FORMAT))


def zip_name(path):
    """returns the zip filename as string"""
    cur_dir = Path(path).resolve()
    parent_dir = cur_dir.parents[0]
    zip_filename = '{}/{}_{}.zip'.format(parent_dir, cur_dir.name, date_str())
    p_zip = Path(zip_filename)
    n = 1
    while p_zip.exists():
        zip_filename = ('{}/{}_{}_{}.zip'.format(parent_dir, cur_dir.name,
                                             date_str(), n))
        p_zip = Path(zip_filename)
        n += 1
    return zip_filename


def all_files(path):
    """iterator returns all files and folders from path as absolute path string
    """
    for child in Path(path).iterdir():
        yield str(child)
        if child.is_dir():
            for grand_child in all_files(str(child)):
                yield str(Path(grand_child))


def zip_dir(path):
    """generate a zip"""
    zip_filename = zip_name(path)
    zip_file = zipfile.ZipFile(zip_filename, 'w')
    print('create:', zip_filename)
    for file in all_files(path):
        print('adding... ', file)
        zip_file.write(file)
    zip_file.close()


if __name__ == '__main__':
    zip_dir('.')
    print('end!')
13
задан Community 23 May 2017 в 12:25
поделиться

4 ответа

Другие ответы могут не давать того типа вывода, который вы ищете, потому что вместо строки с годами, месяцами и т. Д. Помощники Rails просто показывают наибольшую единицу. Если вы ищете что-то более сложное, вот еще один вариант. Вставьте этот метод в помощник:

def time_diff_in_natural_language(from_time, to_time)
  from_time = from_time.to_time if from_time.respond_to?(:to_time)
  to_time = to_time.to_time if to_time.respond_to?(:to_time)
  distance_in_seconds = ((to_time - from_time).abs).round
  components = []

  %w(year month week day).each do |interval|
    # For each interval type, if the amount of time remaining is greater than
    # one unit, calculate how many units fit into the remaining time.
    if distance_in_seconds >= 1.send(interval)
      delta = (distance_in_seconds / 1.send(interval)).floor
      distance_in_seconds -= delta.send(interval)
      components << pluralize(delta, interval)
      # if above line give pain. try below one  
      # components <<  interval.pluralize(delta)  
    end
  end

  components.join(", ")
end

А затем в представлении вы можете сказать что-то вроде:

<%= time_diff_in_natural_language(Time.now, 2.5.years.ago) %>
=> 2 years, 6 months, 2 days 

Данный метод сокращается до нескольких дней, но при желании его можно легко расширить, добавив меньшие единицы.

24
ответ дан 1 December 2019 в 17:11
поделиться

Модуль Rails ActionView включает два метода, которые могут делать то, что вам нужно:

52
ответ дан 1 December 2019 в 17:11
поделиться
2
ответ дан 1 December 2019 в 17:11
поделиться

distance_of_time_in_words является наиболее точным здесь. Ответ Даниила на самом деле неверен: 2,5 года назад должно было произойти ровно 2 года 6 месяцев. Проблема в том, что месяцы содержат 28-31 день, а годы могут быть високосными.

Хотел бы я знать, как это исправить: (

3
ответ дан 1 December 2019 в 17:11
поделиться
Другие вопросы по тегам:

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