web-dev-qa-db-fra.com

Comment obtenir le premier jour du mois prochain en Python?

Comment puis-je obtenir la première date du mois prochain en Python? Par exemple, si c'est maintenant le 2019-12-31, le premier jour du mois suivant est le 2020-01-01. Si c'est maintenant 2019-08-01, le premier jour du mois suivant est 2019-09-01.

Je suis venu avec ceci:

import datetime

def first_day_of_next_month(dt):
    '''Get the first day of the next month. Preserves the timezone.

    Args:
        dt (datetime.datetime): The current datetime

    Returns:
        datetime.datetime: The first day of the next month at 00:00:00.
    '''
    if dt.month == 12:
        return datetime.datetime(year=dt.year+1,
                                 month=1,
                                 day=1,
                                 tzinfo=dt.tzinfo)
    else:
        return datetime.datetime(year=dt.year,
                                 month=dt.month+1,
                                 day=1,
                                 tzinfo=dt.tzinfo)

Est-ce correct? Y a-t-il une meilleure façon?

5
Flux

Voici une solution 1 ligne n'utilisant rien de plus que la bibliothèque datetime standard:

(dt.replace(day=1) + datetime.timedelta(days=32)).replace(day=1)

Exemples:

>>> dt = datetime.datetime(2016, 2, 29)
>>> print((dt.replace(day=1) + datetime.timedelta(days=32)).replace(day=1))
2016-03-01 00:00:00

>>> dt = datetime.datetime(2019, 12, 31)
>>> print((dt.replace(day=1) + datetime.timedelta(days=32)).replace(day=1))
2020-01-01 00:00:00

>>> dt = datetime.datetime(2019, 12, 1)
>>> print((dt.replace(day=1) + datetime.timedelta(days=32)).replace(day=1))
2020-01-01 00:00:00
1
Toby Petty

En utilisant dateutil vous pouvez le faire le plus littéralement possible:

import datetime
from dateutil import relativedelta
today = datetime.date.today()

next_month = today + relativedelta.relativedelta(months=1, day=1)

En anglais: ajoutez 1 mois à la date du jour et réglez le jour (du mois) sur 1. Notez l'utilisation des formes singulières et plurielles de day(s) et month(s). Singulier attribue une valeur à l'attribut, le pluriel ajoute le nombre de périodes.

Vous pouvez stocker cet objet relativedelta.relativedelta Dans une variable et le transmettre. D'autres réponses impliquent plus de logique de programmation.

[~ # ~] modifier [~ # ~] Vous pouvez le faire avec la bibliothèque standard datetime également, mais ce n'est pas le cas belle:

next_month = (today.replace(day=1) + datetime.timedelta(days=32)).replace(day=1)

définit la date au 1er du mois en cours, ajoute 32 jours (ou tout nombre compris entre 31 et 59 qui garantit de passer au mois suivant), puis définit la date au 1er de ce mois.

1
eumiro

Votre chemin semble bon mais je l'aurais fait de cette façon:

import datetime
from dateutil import relativedelta

dt = datetime.datetime(year=1998,
                             month=12,
                             day=12)

nextmonth = dt + relativedelta.relativedelta(months=1)
nextmonth.replace(day=1)
print(nextmonth)
0
marc