Date/time utils

L'attribut self.time d'un service permet d'accéder à datetime de Python et des objets d'Arrow.

UTC maintenant

Appelez self.time.utcnow() pour obtenir l'heure actuelle en UTC. Le format par défaut est YYYY-MM-DD HH:mm:ss. Retourne une chaîne de caractères, sauf si on lui demande de ne pas sérialiser le résultat.

# -*- coding: utf-8 -*-

# Zato
from zato.server.service import Service

class MyService(Service):

    def handle(self):

        # Default
        now = self.time.utcnow()
        self.logger.info('Now (1) is %s', now)

        # Custom output format, still in UTC
        now = self.time.utcnow('DD-MM-YY HH:mm')
        self.logger.info('Now (2) is %s', now)

        # Don't serialize to string
        now = self.time.utcnow(needs_format=False)
        self.logger.info('Now (3) is %r', now)

Sortie dans les logs du serveur :

   INFO - Now (1) is 2025-01-26 13:34:24
   INFO - Now (2) is 26-01-15 13:34
   INFO - Now (3) is](Arrow [2025-01-26T13:34:24.738026+00:00]>

Aujourd'hui

Renvoie la date actuelle. Le format par défaut est YYYY-MM-DD en UTC - les deux peuvent être remplacés. Convertit la sortie en chaîne de caractères, sauf si elle est surchargée.

# -*- coding: utf-8 -*-

# Zato
from zato.server.service import Service

class MyService(Service):

    def handle(self):

        # Default
        today = self.time.today()
        self.logger.info('Today in UTC (1) is %s', today)

        # UTC, custom format
        today = self.time.today('DDMMYY')
        self.logger.info('Today in UTC (2) is %s', today)

        # Don't serialize to string
        today = self.time.today(needs_format=False)
        self.logger.info('Today in UTC (3) is %r', today)

        # A user-provided timezone
        today = self.time.today(tz='Pacific/Fiji')
        self.logger.info('Today in Suva is %s', today)
Sortie dans les logs:

INFO - Today in UTC (1) is 2025-01-26
INFO - Today in UTC (2) is 260115
INFO - Today in UTC (3) is](Arrow [2025-01-26T00:00:00+00:00]>
INFO - Today in Suva is 2025-01-27

Reformatage

Les dates et les heures peuvent être converties d'un format à l'autre à l'aide de self.time.reformat - la méthode accepte une valeur, son format et le format vers lequel elle doit être modifiée. La valeur peut être une chaîne, un datetime ou un objet Arrow.

# -*- coding: utf-8 -*-

# Zato
from zato.server.service import Service

class MyService(Service):

    def handle(self):

        # Convert from DD-MM-YYYY to YY.MM.DD

        value = '15-11-2029'
        self.logger.info('Was: %s', value)

        value = self.time.reformat(value, 'DD-MM-YYYY', 'YY.MM.DD')
        self.logger.info('Now: %s', value)
INFO - Was: 15-11-2029
INFO - Now: 19.11.15

En anticipant le besoin de changer les formats source ou cible, il est possible de stocker l'un ou l'autre ou les deux dans Redis afin qu'ils soient lus lors de l'exécution sans codage en dur dans le code.

Maintenant, au lieu des formats exacts, leurs noms préfixés avec 'kvdb:' sont utilisés. Le préfixe est supprimé et les noms pointent vers les clés Redis qui contiendront les formats exacts.

Le modèle à utiliser dans Redis est kvdb:date-format:$name où $name est le nom fourni en entrée de self.time.reformat. Par exemple, un nom de format 'crm' devrait être stocké dans Redis sous la clé kvdb:date-format:crm.

Supposons qu'il existe des clés Redis comme suit:

127.0.0.1:6379> SET kvdb:date-format:crm "YY-MM-DD HH:mm"
OK
127.0.0.1:6379> SET kvdb:date-format:erp MM-DD-YY
OK

Le code suivant va chercher les formats dans Redis afin de reformater la date du CRM au format attendu par l'ERP. Si les formats changent, aucune mise à jour du code du service ne sera nécessaire.

# -*- coding: utf-8 -*-

# Zato
from zato.server.service import Service

class MyService(Service):

    def handle(self):

        # Convert from DD-MM-YYYY to YY.MM.DD

        value = '15-11-2029 13:17'
        self.logger.info('Was: %s', value)

        value = self.time.reformat(value, 'kvdb:crm', 'kvdb:erp')
INFO - Was: 15-11-2029 13:17
INFO - Now: 11-20-15