{"id":38,"date":"2011-08-03T09:39:00","date_gmt":"2011-08-03T09:39:00","guid":{"rendered":"http:\/\/e-ware.org\/blog\/?p=38"},"modified":"2011-08-03T09:39:00","modified_gmt":"2011-08-03T09:39:00","slug":"portare-avanti-o-indietro-una-data-in-python","status":"publish","type":"post","link":"http:\/\/e-ware.org\/blog\/portare-avanti-o-indietro-una-data-in-python\/","title":{"rendered":"Portare avanti o indietro una data in python"},"content":{"rendered":"<div><\/div>\n<div><span>Quando si opera nel campo dei software gestionali, si ha sempre la necessit\u00e0 di lavorare con le date e le loro mille sfaccettature. Gestire una data non \u00e8 sempre cosa facile poich\u00e9 essa pu\u00f2 essere formattata in modi diversi e la necessit\u00e0 del momento pu\u00f2 spingerci a doverla nuovamente riformattare secondo un canone decisamente diverso (se non opposto) rispetto all&#8217;originale.<\/span><\/div>\n<div><span><br \/><\/span><\/div>\n<div><span>In questo articolo vedremo come, grazie all&#8217;ausilio delle librerie del linguaggio, \u00e8 possibile, con poche righe di codice, &#8220;muovere&#8221; una data nel passato o nel futuro partendo da una a nostra disposizione.<\/span><\/div>\n<div><span><br \/><\/span><\/div>\n<div><span>Immaginiamo di dove gestire la scadenza di un servizio. All&#8217;utente verr\u00e0 chiesto (nel modo che si richiede pi\u00f9 opportuno) di fornire una data di avvio del servizio e la sua durata. Nel nostro caso l&#8217;utente dovr\u00e0 specificare quest&#8217;ultimo parametro in giorni. Riversiamo i dati cos\u00ec ottenuti rispettivamente nelle variabili <i>data_avvio<\/i> e <i>durata_giorni<\/i> e calcoliamo la data di chiusura del servizio.<\/span><\/div>\n<div><span><br \/><\/span><\/div>\n<div><span>&#8212;python&#8212;&#8212;&#8212;&#8212;&#8212;-<\/span><\/div>\n<div><\/div>\n<div><span><i>from datetime import date, datetime, time, timedelta<\/i><\/span><\/div>\n<div><span><i>def calcola_scadenza(data_attivazione, durata_giorni):<br \/>\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 str_data_attivazione = datetime.strptime(data_attivazione,&#8217;%Y-%m-%d&#8217;)<br \/>\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 data_fine = data_attivazione + timedelta(days=durata_giorni)<br \/>\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 res = datetime.strftime(data_fine,&#8217;%Y-%m-%d&#8217;)<br \/>\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 return res<\/i><\/span><\/div>\n<div><\/div>\n<div><span>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/span><\/div>\n<div><span><br \/><\/span><\/div>\n<div><span>Innanzitutto partiamo con l&#8217;importazione del necessario dalla libreria <b>datetime<\/b>. Questa libreria \u00e8 molto versatile ed utilissima quando si vuole lavorare con questo particolare tipo di dati. Inoltre \u00e8 ben documentata ed \u00e8 semplice da usare nei propri progetti. Ora definiamo la nostra funzione che accetta come parametri la data di avvio e la durata in giorni del servizio. Successivamente, mediante l&#8217;ausilio della funzione <b> datetime.strptime<\/b> si converte la stringa in un formato data che rispetta la formattazione definita come secondo parametro. Nel nostro caso la data avr\u00e0 formato anno-mese-giorno. Qui arriva la parte interessante dell&#8217;algoritmo. Come si pu\u00f2 vedere la data di fine servizio viene calcolata grazie all&#8217;uso di <b>timedelta<\/b>. Come il nome della funzione lascia intendere, timedelta serve a creare una data con un offset calcolato in base ai parametri passati alla stessa. In questo caso abbiamo deciso di spostare la data attuale di n giorni nel fututo dicendo a timedelta di spostarsi in base ai giorni (days). Infine con <b>datetime.strftime<\/b> compiamo l&#8217;operazione inversa rispetto a datetime.strptime, ovvero otteniamo una stringa partendo da una data e lasciamo la funzione ritornando il valore appena ottenuto.<\/span> <\/div>\n<div><span><br \/><\/span><\/div>\n<div><span>Nonostante l&#8217;esempio sia volutamente ridotto al minimo indispensabile, \u00e8 possibile notare con facilit\u00e0 come gli strumenti mostrati siano potenti e versatili semplificando non di poco il lavoro dello sviluppatore. Timedelta, ad esempio, ci permette di tornare indietro passando i parametri in forma negativa. Questo pu\u00f2 essere notevolmente utile quando si vuole sapere la data di qualche giorno o mese fa. Importante \u00e8 anche l&#8217;uso di datetime. Grazie a strftime e strptime \u00e8 possibile ottenere date formattate come meglio si crede. Ora non resta che sperimentare quanto imparato.<\/span><b><span><br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><\/b><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Quando si opera nel campo dei software gestionali, si ha sempre la necessit\u00e0 di lavorare con le date e le loro mille sfaccettature. Gestire una data non \u00e8 sempre cosa facile poich\u00e9 essa pu\u00f2 essere formattata in modi diversi e la necessit\u00e0 del momento pu\u00f2 spingerci a doverla nuovamente riformattare secondo un canone decisamente diverso [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30,4,5],"tags":[],"class_list":["post-38","post","type-post","status-publish","format-standard","hentry","category-algoritmi","category-opencode","category-python"],"views":2703,"_links":{"self":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts\/38","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/comments?post=38"}],"version-history":[{"count":0,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts\/38\/revisions"}],"wp:attachment":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/media?parent=38"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/categories?post=38"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/tags?post=38"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}