Bibliothèque complète de date et heure

Je me demande si quelqu’un connaît une bonne bibliothèque de date et d’heure dotée des fonctionnalités correctement implémentées, telles que:

  • Résolution en microseconde
  • L’heure d’été
    • Exemple: il sait que 2 h 30 n’existait pas aux États-Unis le 8 mars 2009 pour les fuseaux horaires qui respectent l’heure avancée.
    • Je devrais pouvoir spécifier un fuseau horaire du type “US / Eastern” et il devrait être suffisamment intelligent pour savoir si un horodatage donné doit correspondre à EST ou à l’EST.
  • Plages de dates personnalisées
    • Possibilité de créer des calendriers professionnels spécialisés qui permettent d’éviter les week-ends et les jours fériés.
  • Plages de temps personnalisées
    • Possibilité de définir les heures ouvrables afin que les heures demandées en dehors des heures ouvrables puissent être arrondies à l’heure de validité précédente ou suivante.
  • Arithmétique
    • Pouvoir append et soustraire des nombres entiers de toutes les unités (années, mois, semaines, jours, heures, minutes, …). Notez que l’ajout de quelque chose comme 0,5 jour n’est pas bien défini car cela peut signifier 12 heures ou la moitié d’une journée (ce qui ne correspond pas à 24 heures lorsque l’heure avancée change).
  • Alignement des limites naturelles
    • Étant donné l’horodatage, j’aimerais pouvoir arrondir à la décennie, l’année, le mois, la semaine, le quart d’heure, l’heure, etc. le plus proche.

J’utilise actuellement Python, bien que je sois heureux d’avoir une solution dans un autre langage comme perl, C ou C ++.

J’ai constaté que les bibliothèques Python intégrées manquent de sophistication avec leur logique d’économie de jour et qu’il n’existe pas de moyen évident (pour moi) de configurer des éléments tels que des plages horaires personnalisées.

Le module datetime la bibliothèque standard de Python est délibérément limité aux aspects non controversés qui ne changent pas tout le temps par un fiat législatif. C’est pourquoi il exclut délibérément la prise en charge directe des fuseaux horaires, de l’heure d’été, de l’parsing floue et de l’arithmétique mal définie (comme mois plus tard “…) et similaires. En plus de cela, dateutil pour de nombreux types de manipulations et pytz pour les fuseaux horaires (y compris les problèmes d’heure d’été), ajoutez l’essentiel de ce que vous demandez, bien que ce ne soit pas des choses extrêmement explosives comme des “vacances” qui varient énormément, pas seulement entre les juridictions politiques. mais même parmi les employeurs au sein d’une même juridiction (par exemple, aux États-Unis, certains employeurs considèrent le “Columbus Day” comme un jour férié, mais beaucoup ne le font pas – et certains, qui ont des bureaux dans de nombreux endroits, le prévoient comme un jour férié à certains endroits mais pas à autres, étant donné ce chaos total et total, s’attendre à trouver une bibliothèque polyvalente qui donne un sens magique au chaos est assez étrange).

Jetez un coup d’œil aux paquets dateutil et éventuellement mx.DateTime .

Vu cela l’autre jour, je ne l’ai pas utilisé moi-même … semble prometteur. http://crsmithdev.com/arrow/

Je devrais pouvoir spécifier un fuseau horaire du type “US / Eastern” et il devrait être suffisamment intelligent pour savoir si un horodatage donné doit correspondre à EST ou à l’EST.

Cette partie n’est pas toujours possible – de la même manière qu’il n’existe pas 2h30 du matin pour un jour de l’année (dans les fuseaux horaires avec heure avancée qui passe à 2h00 du matin), 2h30 existe deux fois pour un autre jour – une fois en HAE puis une heure plus tard en HNE. Si vous transmettez cette date / heure à la bibliothèque, comment sait-elle laquelle des deux fois dont vous parlez?

Bien que le livre date de plus de dix ans, je vous recommande fortement de lire Bibliothèque standard date / heure C: Programmation des calendriers et des horloges du monde par Lance Latham. C’est l’un de ces livres que vous retrouverez de temps en temps avec étonnement. L’auteur aborde plus de détails que vous le souhaitez concernant les calendriers et les systèmes de chronométrage, et développe en cours le code source en une bibliothèque (écrite en C) pour gérer tous les calculs.

Étonnamment, il semble être encore imprimé …

Je viens de publier une bibliothèque Python appelée Fleming ( https://github.com/ambitioninc/fleming ), qui semble résoudre deux de vos problèmes de sophistication en ce qui concerne l’heure avancée.

Problème 1, arithmétique – Fleming a une fonction add_timedelta qui prend un timedelta (du module datetime de Python) ou un relativedelta de python-dateutil et l’ajoute à un object datetime. La fonction add_timedelta gère le cas où l’object datetime traverse une limite DST. Consultez https://github.com/ambitioninc/fleming#add_timedelta pour une explication complète et des exemples. Voici un court exemple:

 import fleming import datetime import timedelta dt = fleming.add_timedelta(dt, datetime.timedelta(weeks=2, days=1)) print dt 2013-03-29 20:00:00-04:00 # Do timedelta arithmetic such that it starts in DST and crosses over into no DST. # Note that the hours stay in tact and the timezone changes dt = fleming.add_timedelta(dt, datetime.timedelta(weeks=-4)) print dt 2013-03-01 20:00:00-05:00 

Problème 2, alignement des limites naturelles – Fleming a une fonction de sol qui peut prendre un alignement arbitraire. Supposons que votre heure était datetime (2013, 2, 3) et que vous lui avez atsortingbué un intervalle minimum de mois = 3. Cela signifie qu’il sera arrondi au sortingmestre le plus proche. De même, vous pouvez spécifier la décennie la plus proche en utilisant l’année = 10 dans les arguments. Consultez ( https://github.com/ambitioninc/fleming#floordt-within_tznone-yearnone-monthnone-weeknone-daynone-hournone-minutenone-secondnone-microsecondnone ) pour des exemples complets et des illustrations. Voici un rapide:

 import fleming import datetime # Get the starting of a quarter by using month=3 print fleming.floor(datetime.datetime(2013, 2, 4), month=3) 2013-01-01 00:00:00