Как вычесть две даты йода? [Дубликат]

Из docs :

object.__div__(self, other) 
object.__truediv__(self, other)

Этими методами реализуется оператор деления (/). Метод __truediv__() используется, когда действует __future__.division, в противном случае используется __div__(). Если определен только один из этих двух методов, объект не будет поддерживать деление в альтернативном контексте; TypeError будет поднят вместо этого.

blockquote>

И здесь :

Будущий оператор является директивой для компилятора, что конкретный [ python] должна быть скомпилирована с использованием синтаксиса или семантики, которые будут доступны в ... будущей версии Python. Будущий оператор предназначен для облегчения перехода на будущие версии Python, которые вносят несовместимые изменения в язык. Он позволяет использовать новые функции перед выпуском, в котором эта функция становится стандартной.

future_statement: from __future__ import feature

Функции, распознаваемые Python 2.x, - это unicode_literals, print_function, absolute_import, division, generators, nested_scopes и with_statement

blockquote>

Теперь некоторые тесты:

~$ python2.7
Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 3/2
1
>>> exit()

~$ python3.2
Python 3.2.3 (v3.2.3:3d0686d90f55, Apr 10 2012, 11:25:50) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 3/2
1.5

Итак, вы видите, что действие оператора / изменилось на python 3.x. Вы также можете увидеть это в следующем примере:

class Dog(object):
    def __div__(self, other):
        print("__div__ called")
    def __truediv__(self, other):
        print("__truediv__ called")


Dog() / Dog()

--output:--
~/python_programs$ python2.7 myprog.py 
__div__ called

~/python_programs$ python3.4 myprog.py
__truediv__ called

Поскольку __truediv__ не вызывается оператором / в python 2.x, переопределяя __truediv__ в python 2.x не имеет никакого эффекта.

PEP 238 - PEP 238 -- Changing the Division Operator

We propose the following transitional measures:

    - Classic division will remain the default in the Python 2.x
      series; true division will be standard in Python 3.0.

    - The // operator will be available to request floor[, i.e. integer,] 
      division unambiguously.

    - The future division statement, spelled "from __future__ import
      division", will change the / operator to mean true division
      throughout the [program]

Теперь посмотрите, что здесь происходит:

from __future__ import division

class Dog(object):
    def __div__(self, other):
        print("__div__ called")
    def __truediv__(self, other):
        print("__truediv__ called")


Dog() / Dog()

--output:--
~/python_programs$ python2.7 myprog.py 
__truediv__ called

~/python_programs$ python3.4 myprog.py
__truediv__ called

Теперь вы получаете эффект python3.x для оператора / в python 2.x. Итак, теперь вы можете переопределить __truediv__, чтобы оператор / выполнял то, что вы хотите.

Обратите внимание: если вы хотите, чтобы целочисленное деление в python 3.x, т. Е. 3/2 => 1, тогда вам нужно используйте оператор //, который реализуется __floordiv__. Аналогично, если вы выполняете from __future__ import division в python 2.x, то для получения целочисленного деления вам необходимо использовать оператор //; и если вы хотите переопределить оператор // в классе, вам нужно реализовать __floordiv__.

37
задан Grzegorz Oledzki 4 April 2013 в 15:04
поделиться

3 ответа

Период имеет конструктор, который принимает два ReadableInstant экземпляра :

Period diff = new Period(start, end);

(ReadableInstant - интерфейс, реализованный DateTime, а также другими классами.)

54
ответ дан millimoose 4 April 2013 в 15:04
поделиться

Это помогает? http://joda-time.sourceforge.net/key_period.html Показан пример ниже

DateTime start = new DateTime(2004, 12, 25, 0, 0, 0, 0);
DateTime end = new DateTime(2006, 1, 1, 0, 0, 0, 0);

// period of 1 year and 7 days
Period period = new Period(start, end);

// calc will equal end
DateTime calc = start.plus(period);

// able to calculate whole days between two dates easily
Days days = Days.daysBetween(start, end);
6
ответ дан Rush 4 April 2013 в 15:04
поделиться

Я думаю, что вы можете создать Period используя этот конструктор, который принимает два DateTime объекта.

1
ответ дан tehlexx 4 April 2013 в 15:04
поделиться
Другие вопросы по тегам:

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