modulitiz-micro 2.33.0__py311-none-any.whl → 2.34.0__py311-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- modulitiz_micro/ModuloBase64.py +61 -61
- modulitiz_micro/ModuloColorText.py +35 -35
- modulitiz_micro/ModuloDate.py +295 -295
- modulitiz_micro/ModuloFunzioni.py +70 -70
- modulitiz_micro/ModuloListe.py +150 -150
- modulitiz_micro/ModuloMeteo.py +72 -72
- modulitiz_micro/ModuloNumeri.py +130 -130
- modulitiz_micro/ModuloPyinstaller.py +29 -29
- modulitiz_micro/ModuloSeriale.py +61 -61
- modulitiz_micro/ModuloStatistiche.py +31 -31
- modulitiz_micro/ModuloStringhe.py +180 -180
- modulitiz_micro/ModuloTarghe.py +46 -46
- modulitiz_micro/android/ModuloAndroid.py +18 -18
- modulitiz_micro/android/ModuloAndroidAdb.py +48 -48
- modulitiz_micro/android/ModuloAndroidSim.py +130 -130
- modulitiz_micro/android/beans/SmsBean.py +12 -12
- modulitiz_micro/android/enums/AndroidSmsTypeEnum.py +17 -17
- modulitiz_micro/database/AbstractDatabaseService.py +13 -13
- modulitiz_micro/database/AbstractSql.py +69 -69
- modulitiz_micro/database/ModuloSqlOracle.py +19 -19
- modulitiz_micro/database/ModuloSqlServer.py +43 -43
- modulitiz_micro/database/eccezioni/EccezioneDbNoData.py +6 -6
- modulitiz_micro/database/mysql/AbstractBasicMysql.py +114 -114
- modulitiz_micro/database/mysql/ModuloMysql.py +163 -163
- modulitiz_micro/database/mysql/MysqlCommonConverter.py +47 -47
- modulitiz_micro/database/mysql/eccezioni/EccezioneMysqlOffline.py +6 -6
- modulitiz_micro/database/sqlite/AbstractBasicSQLite.py +114 -114
- modulitiz_micro/database/sqlite/ModuloSQLite.py +82 -82
- modulitiz_micro/eccezioni/EccezioneBase.py +7 -7
- modulitiz_micro/eccezioni/EccezioneCtrlC.py +7 -7
- modulitiz_micro/eccezioni/EccezioneRuntime.py +7 -7
- modulitiz_micro/eccezioni/EccezioneScheduler.py +7 -7
- modulitiz_micro/eccezioni/EccezioneSoNonSupportato.py +7 -7
- modulitiz_micro/eccezioni/http/EccezioneHttp.py +8 -8
- modulitiz_micro/eccezioni/http/EccezioneHttp404.py +7 -7
- modulitiz_micro/eccezioni/http/EccezioneHttpGeneric.py +7 -7
- modulitiz_micro/files/ModuloFiles.py +173 -173
- modulitiz_micro/files/ModuloLogging.py +69 -69
- modulitiz_micro/files/ModuloZip.py +42 -42
- modulitiz_micro/files/cache/CacheBean.py +5 -5
- modulitiz_micro/files/cache/CacheRam.py +29 -29
- modulitiz_micro/files/cache/DatabaseCache.py +91 -91
- modulitiz_micro/files/cache/decorators/cacheRam.py +26 -26
- modulitiz_micro/files/git/ModuloGit.py +28 -28
- modulitiz_micro/files/git/decorators/catchAndRaiseGitExceptions.py +19 -19
- modulitiz_micro/files/git/exceptions/EccezioneGit.py +7 -7
- modulitiz_micro/gestionedom/GestioneDom.py +44 -44
- modulitiz_micro/init/AbstractBasicInit.py +27 -27
- modulitiz_micro/init/AbstractInit.py +11 -11
- modulitiz_micro/keylogger/EccezioneKeyLogger.py +7 -7
- modulitiz_micro/keylogger/ModuloKeylogger.py +73 -73
- modulitiz_micro/multithread/ModuloThread.py +26 -26
- modulitiz_micro/multithread/ModuloThreadLogger.py +8 -8
- modulitiz_micro/multithread/ModuloThreadWithCallbackError.py +25 -25
- modulitiz_micro/nlp/ModuloNlp.py +36 -36
- modulitiz_micro/nlp/ModuloNlpDateAndTime.py +59 -59
- modulitiz_micro/rete/ModuloNetworking.py +67 -67
- modulitiz_micro/rete/ModuloOpenVpn.py +15 -15
- modulitiz_micro/rete/email/EmailBean.py +5 -5
- modulitiz_micro/rete/email/ModuloEmail.py +90 -90
- modulitiz_micro/rete/http/ModuloHttp.py +115 -115
- modulitiz_micro/rete/http/ModuloHttpConnectionSafe.py +91 -91
- modulitiz_micro/rete/http/ModuloHttpUtils.py +69 -69
- modulitiz_micro/rete/http/beans/HttpResponseBean.py +5 -5
- modulitiz_micro/rete/http/decorators/catchAndRaiseHttpExceptions.py +22 -22
- modulitiz_micro/rete/ntp/AbstractModuloNtp.py +73 -73
- modulitiz_micro/rete/ntp/ModuloNtpIt.py +8 -8
- modulitiz_micro/rete/socketserver/AbstractBasicGetSocketServer.py +35 -35
- modulitiz_micro/rete/socketserver/AbstractSocketServer.py +267 -267
- modulitiz_micro/rete/ssl/ModuloSsl.py +56 -56
- modulitiz_micro/sistema/EnvVarsEnum.py +9 -9
- modulitiz_micro/sistema/ModuloEnvVars.py +34 -34
- modulitiz_micro/sistema/ModuloSystem.py +298 -298
- modulitiz_micro/sistema/ModuloSystemPipe.py +67 -67
- modulitiz_micro/social/telegram/{ModuloTelegram.py → AbstractModuloTelegram.py} +53 -52
- modulitiz_micro/social/telegram/ModuloTelegramSimple.py +26 -26
- modulitiz_micro/util/beans/conf/AbstractBasicConfBean.py +11 -11
- modulitiz_micro/util/beans/conf/AbstractConfBean.py +16 -16
- modulitiz_micro/util/beans/fileconf/AbstractBasicFileConfBean.py +11 -11
- modulitiz_micro/util/beans/fileconf/AbstractFileConfBean.py +13 -13
- modulitiz_micro/util/beans/globalvar/AbstractBasicGlobalVarBean.py +15 -15
- modulitiz_micro/util/beans/globalvar/AbstractGlobalVarBean.py +34 -34
- modulitiz_micro/util/decorators/noAwait.py +23 -23
- modulitiz_micro/util/pip/AbstractModuloPip.py +41 -41
- modulitiz_micro/util/pip/ModuloPip.py +49 -49
- modulitiz_micro/util/scheduler/AbstractScheduler.py +32 -32
- modulitiz_micro/util/spooler/AbstractSpooler.py +14 -14
- modulitiz_micro/util/spooler/Spooler.py +18 -18
- modulitiz_micro/util/spooler/beans/QueueBean.py +8 -8
- modulitiz_micro/util/spooler/decorators/spooler.py +49 -49
- modulitiz_micro/util/spooler/eccezioni/EccezioneSpooler.py +7 -7
- modulitiz_micro/util/spooler/eccezioni/EccezioneSpoolerFull.py +7 -7
- modulitiz_micro/util/unittesting/AbstractOverrideTestUtil.py +31 -31
- modulitiz_micro/util/unittesting/AbstractTestUtil.py +11 -11
- modulitiz_micro/util/unittesting/ModuloRunUnitTest.py +25 -25
- modulitiz_micro/util/wheel/ModuloBuildWheel.py +117 -117
- modulitiz_micro/util/wheel/ModuloCheckTestNamingConvention.py +83 -83
- modulitiz_micro/util/wheel/ModuloToml.py +40 -40
- modulitiz_micro/util/wheel/ModuloWheel.py +12 -12
- {modulitiz_micro-2.33.0.dist-info → modulitiz_micro-2.34.0.dist-info}/LICENSE +21 -21
- {modulitiz_micro-2.33.0.dist-info → modulitiz_micro-2.34.0.dist-info}/METADATA +64 -64
- modulitiz_micro-2.34.0.dist-info/RECORD +104 -0
- modulitiz_micro-2.33.0.dist-info/RECORD +0 -104
- {modulitiz_micro-2.33.0.dist-info → modulitiz_micro-2.34.0.dist-info}/WHEEL +0 -0
- {modulitiz_micro-2.33.0.dist-info → modulitiz_micro-2.34.0.dist-info}/top_level.txt +0 -0
modulitiz_micro/ModuloDate.py
CHANGED
@@ -1,295 +1,295 @@
|
|
1
|
-
import time
|
2
|
-
from datetime import UTC
|
3
|
-
from datetime import date
|
4
|
-
from datetime import datetime
|
5
|
-
from datetime import time as dt_time
|
6
|
-
from datetime import timedelta
|
7
|
-
from datetime import timezone
|
8
|
-
|
9
|
-
|
10
|
-
class ModuloDate(object):
|
11
|
-
"""
|
12
|
-
Utility per gestire operazioni e formattazioni sulle date.
|
13
|
-
"""
|
14
|
-
|
15
|
-
FORMATO_DATA="%Y-%m-%d"
|
16
|
-
FORMATO_DATA_IT="%d/%m/%Y"
|
17
|
-
FORMATO_DATA_ORA="%Y-%m-%d %H:%M:%S"
|
18
|
-
FORMATO_DATA_ORA_NOMEFILE="%Y-%m-%d_%H-%M-%S"
|
19
|
-
FORMATO_DATA_ORA_NOSPAZI="%Y%m%d%H%M%S"
|
20
|
-
FORMATO_ORA="%H:%M:%S"
|
21
|
-
|
22
|
-
|
23
|
-
@staticmethod
|
24
|
-
def now()->datetime:
|
25
|
-
"""
|
26
|
-
Data e ora attuali.
|
27
|
-
"""
|
28
|
-
return datetime.now()
|
29
|
-
|
30
|
-
@classmethod
|
31
|
-
def nowUtc(cls)->datetime:
|
32
|
-
"""
|
33
|
-
Data e ora attuali in formato UTC (quindi senza fuso orario e DST)
|
34
|
-
"""
|
35
|
-
data=datetime.now(timezone.utc)
|
36
|
-
data=cls.setTimezoneUtc(data)
|
37
|
-
return data
|
38
|
-
|
39
|
-
@staticmethod
|
40
|
-
def today()->date:
|
41
|
-
"""
|
42
|
-
Data odierna, senza ora.
|
43
|
-
"""
|
44
|
-
return date.today()
|
45
|
-
|
46
|
-
@staticmethod
|
47
|
-
def getSecs()->int:
|
48
|
-
"""
|
49
|
-
Timestamp in secondi in formato UTC
|
50
|
-
"""
|
51
|
-
return int(time.time())
|
52
|
-
|
53
|
-
@staticmethod
|
54
|
-
def getMillis()->int:
|
55
|
-
"""
|
56
|
-
Timestamp in millisecondi in formato UTC
|
57
|
-
"""
|
58
|
-
return int(time.time()*1000)
|
59
|
-
|
60
|
-
@classmethod
|
61
|
-
def getWeekDay(cls,data:datetime|None=None)->str:
|
62
|
-
"""
|
63
|
-
Se te lo restituisce in inglese devi settare il locale
|
64
|
-
"""
|
65
|
-
if data is None:
|
66
|
-
data=cls.now()
|
67
|
-
return data.date().strftime("%A")
|
68
|
-
|
69
|
-
#
|
70
|
-
# conversioni
|
71
|
-
#
|
72
|
-
@classmethod
|
73
|
-
def dateToString(cls,data:datetime|None=None,formato:str=FORMATO_DATA_ORA)->str:
|
74
|
-
"""
|
75
|
-
Formatta un oggetto data.
|
76
|
-
:param data: data da formattare, se non specificata viene usata la data attuale
|
77
|
-
:param formato: in che modo deve essere formattata la data, se non specificato viene usato il formato inglese
|
78
|
-
"""
|
79
|
-
if data is None:
|
80
|
-
data=cls.now()
|
81
|
-
return data.strftime(formato)
|
82
|
-
|
83
|
-
@staticmethod
|
84
|
-
def stringToDate(stringa:str,formato:str=FORMATO_DATA_ORA)->datetime:
|
85
|
-
"""
|
86
|
-
Trasforma una data in formato stringa a oggetto.
|
87
|
-
:param stringa: stringa da trasformare in data
|
88
|
-
:param formato: in che modo deve essere formattata la data, se non specificato viene usato il formato inglese
|
89
|
-
"""
|
90
|
-
return datetime.strptime(stringa,formato)
|
91
|
-
|
92
|
-
@staticmethod
|
93
|
-
def timeToString(orario:dt_time,formato:str=FORMATO_ORA)->str:
|
94
|
-
"""
|
95
|
-
Formatta un oggetto di tipo ora.
|
96
|
-
:param orario: orario da formattare
|
97
|
-
:param formato: in che modo deve essere formattato l'orario, se non specificato viene usato il formato standard
|
98
|
-
"""
|
99
|
-
return orario.strftime(formato)
|
100
|
-
@classmethod
|
101
|
-
def stringToTime(cls,stringa:str,formato:str=FORMATO_ORA)->dt_time:
|
102
|
-
"""
|
103
|
-
Formatta un oggetto di tipo ora.
|
104
|
-
:param stringa: stringa da formattare in orario
|
105
|
-
:param formato: in che modo deve essere formattato l'orario, se non specificato viene usato il formato standard
|
106
|
-
"""
|
107
|
-
return cls.dateToTime(cls.stringToDate(stringa,formato))
|
108
|
-
|
109
|
-
@classmethod
|
110
|
-
def timeToDate(cls,orario:dt_time)->datetime:
|
111
|
-
"""
|
112
|
-
Converte da oggetto orario a data completa.
|
113
|
-
Viene aggiunta la data odierna all'orario passato in input.
|
114
|
-
"""
|
115
|
-
return datetime.combine(cls.today(), orario)
|
116
|
-
|
117
|
-
@staticmethod
|
118
|
-
def timedeltaToTime(orario:timedelta)->dt_time:
|
119
|
-
"""
|
120
|
-
Converte un oggetto timedelta a oggetto orario.
|
121
|
-
"""
|
122
|
-
return (datetime.min + orario).time()
|
123
|
-
|
124
|
-
@staticmethod
|
125
|
-
def dateToTime(data:datetime)->dt_time:
|
126
|
-
"""
|
127
|
-
Rimuove la data da un oggetto data completo, lasciando solo l'orario.
|
128
|
-
"""
|
129
|
-
return data.time()
|
130
|
-
|
131
|
-
@staticmethod
|
132
|
-
def dateToTimestamp(data:datetime)->int:
|
133
|
-
"""
|
134
|
-
Converte un oggetto data completo in timestamp in secondi.
|
135
|
-
Se ti serve avere il timestamp in formato UTC usa il metodo dedicato.
|
136
|
-
"""
|
137
|
-
return int(datetime.timestamp(data))
|
138
|
-
@staticmethod
|
139
|
-
def timestampToDate(timestamp:int|float)->datetime:
|
140
|
-
"""
|
141
|
-
Converte un timestamp in secondi in un oggetto data completo.
|
142
|
-
Se ti serve avere il timestamp in formato UTC usa il metodo dedicato.
|
143
|
-
"""
|
144
|
-
return datetime.fromtimestamp(timestamp)
|
145
|
-
|
146
|
-
@classmethod
|
147
|
-
def dateToTimestampUtc(cls,data:datetime)->int:
|
148
|
-
"""
|
149
|
-
Converte un oggetto data completo in timestamp in secondi in formato UTC.
|
150
|
-
"""
|
151
|
-
return cls.dateToTimestamp(cls.setTimezoneUtc(data))
|
152
|
-
@classmethod
|
153
|
-
def timestampUtcToDate(cls,timestamp:int|float)->datetime:
|
154
|
-
"""
|
155
|
-
Converte un timestamp in secondi in formato UTC in un oggetto data completo.
|
156
|
-
Questo metodo richiede python >= 3.11
|
157
|
-
"""
|
158
|
-
return datetime.fromtimestamp(timestamp,UTC)
|
159
|
-
|
160
|
-
#
|
161
|
-
# operazioni
|
162
|
-
#
|
163
|
-
@staticmethod
|
164
|
-
def dateDiff(data1:datetime,data2:datetime)->timedelta:
|
165
|
-
"""
|
166
|
-
Calcola la differenza di tempo (sia data che oraria) tra 2 date complete.
|
167
|
-
"""
|
168
|
-
return data1-data2
|
169
|
-
|
170
|
-
@classmethod
|
171
|
-
def minutesDiff(cls,data1:datetime,data2:datetime)->int:
|
172
|
-
"""
|
173
|
-
Calcola la differenza in minuti tra 2 date complete.
|
174
|
-
"""
|
175
|
-
diff=cls.dateDiff(data1,data2)
|
176
|
-
diffValue=0
|
177
|
-
if diff.days is not None and diff.days!=0:
|
178
|
-
diffValue+=diff.days*24*60
|
179
|
-
diffValue+=int(diff.seconds/60)
|
180
|
-
return diffValue
|
181
|
-
@classmethod
|
182
|
-
def hoursDiff(cls,data1:datetime,data2:datetime)->int:
|
183
|
-
"""
|
184
|
-
Calcola la differenza in ore tra 2 date complete.
|
185
|
-
"""
|
186
|
-
diff=cls.dateDiff(data1, data2)
|
187
|
-
diffValue=0
|
188
|
-
if diff.days is not None and diff.days!=0:
|
189
|
-
diffValue+=diff.days*24
|
190
|
-
diffValue+=int(diff.seconds/3600)
|
191
|
-
return diffValue
|
192
|
-
@classmethod
|
193
|
-
def daysDiff(cls,data1:datetime,data2:datetime) -> int:
|
194
|
-
"""
|
195
|
-
Calcola la differenza in giorni tra 2 date complete.
|
196
|
-
"""
|
197
|
-
diff=cls.dateDiff(data1,data2)
|
198
|
-
if diff.days is not None and diff.days!=0:
|
199
|
-
return diff.days
|
200
|
-
return 0
|
201
|
-
|
202
|
-
@staticmethod
|
203
|
-
def plusMinusDays(data:datetime,days:int|float)->datetime:
|
204
|
-
"""
|
205
|
-
Aggiunge o toglie giorni ad una data completa.
|
206
|
-
"""
|
207
|
-
td=timedelta(days=abs(days))
|
208
|
-
if days>=0:
|
209
|
-
return data + td
|
210
|
-
return data - td
|
211
|
-
|
212
|
-
@staticmethod
|
213
|
-
def plusMinusHours(data:datetime,hours:int|float)->datetime:
|
214
|
-
"""
|
215
|
-
Aggiunge o toglie ore ad una data completa.
|
216
|
-
"""
|
217
|
-
td=timedelta(hours=abs(hours))
|
218
|
-
if hours>=0:
|
219
|
-
return data + td
|
220
|
-
return data - td
|
221
|
-
|
222
|
-
@staticmethod
|
223
|
-
def plusMinusMinutes(data:datetime,minutes:int|float)->datetime:
|
224
|
-
"""
|
225
|
-
Aggiunge o toglie minuti ad una data completa.
|
226
|
-
"""
|
227
|
-
td=timedelta(minutes=abs(minutes))
|
228
|
-
if minutes>=0:
|
229
|
-
return data + td
|
230
|
-
return data - td
|
231
|
-
|
232
|
-
@staticmethod
|
233
|
-
def plusMinusSeconds(data:datetime,seconds:int|float)->datetime:
|
234
|
-
"""
|
235
|
-
Aggiunge o toglie minuti ad una data completa.
|
236
|
-
"""
|
237
|
-
td=timedelta(seconds=abs(seconds))
|
238
|
-
if seconds>=0:
|
239
|
-
return data + td
|
240
|
-
return data - td
|
241
|
-
|
242
|
-
@staticmethod
|
243
|
-
def setStartOfDay(data:datetime)->datetime:
|
244
|
-
"""
|
245
|
-
Imposta l'inizio del giorno ad una data completa.
|
246
|
-
"""
|
247
|
-
return data.replace(hour=0, minute=0, second=0, microsecond=0)
|
248
|
-
|
249
|
-
@staticmethod
|
250
|
-
def setEndOfDay(data:datetime)->datetime:
|
251
|
-
"""
|
252
|
-
Imposta la fine del giorno ad una data completa.
|
253
|
-
"""
|
254
|
-
return data.replace(hour=23, minute=59, second=59, microsecond=999999)
|
255
|
-
|
256
|
-
@classmethod
|
257
|
-
def setTimezoneLocale(cls,data:datetime)->datetime:
|
258
|
-
"""
|
259
|
-
Imposta il fuso orario locale ad una data completa.
|
260
|
-
"""
|
261
|
-
return cls.setTimezoneUtc(data).astimezone(tz=None)
|
262
|
-
|
263
|
-
@classmethod
|
264
|
-
def setTimezoneUtc(cls,data:datetime)->datetime:
|
265
|
-
"""
|
266
|
-
Imposta SOLO il fuso orario UTC ad una data completa.
|
267
|
-
"""
|
268
|
-
return cls.setTimezoneFromTzInfo(data,timezone.utc)
|
269
|
-
|
270
|
-
@staticmethod
|
271
|
-
def setTimezoneFromTzInfo(data:datetime,tz:datetime.tzinfo)->datetime:
|
272
|
-
"""
|
273
|
-
Imposta un fuso orario ad una data completa.
|
274
|
-
"""
|
275
|
-
return data.replace(tzinfo=tz)
|
276
|
-
|
277
|
-
@classmethod
|
278
|
-
def getTimezoneLocal(cls)->datetime.tzinfo:
|
279
|
-
"""
|
280
|
-
Ritorna il fuso orario locale.
|
281
|
-
"""
|
282
|
-
return cls.now().astimezone().tzinfo
|
283
|
-
|
284
|
-
#
|
285
|
-
# altre funzioni
|
286
|
-
#
|
287
|
-
@classmethod
|
288
|
-
def calculateElapsedSecs(cls,millisInizio:int)->str:
|
289
|
-
"""
|
290
|
-
Crea la frase che mostra quanti secondi sono trascorsi dall'inizio.
|
291
|
-
"""
|
292
|
-
elapsedSecs=int((cls.getMillis()-millisInizio)*0.001)
|
293
|
-
if elapsedSecs==0:
|
294
|
-
return ""
|
295
|
-
return f" in {elapsedSecs}s"
|
1
|
+
import time
|
2
|
+
from datetime import UTC
|
3
|
+
from datetime import date
|
4
|
+
from datetime import datetime
|
5
|
+
from datetime import time as dt_time
|
6
|
+
from datetime import timedelta
|
7
|
+
from datetime import timezone
|
8
|
+
|
9
|
+
|
10
|
+
class ModuloDate(object):
|
11
|
+
"""
|
12
|
+
Utility per gestire operazioni e formattazioni sulle date.
|
13
|
+
"""
|
14
|
+
|
15
|
+
FORMATO_DATA="%Y-%m-%d"
|
16
|
+
FORMATO_DATA_IT="%d/%m/%Y"
|
17
|
+
FORMATO_DATA_ORA="%Y-%m-%d %H:%M:%S"
|
18
|
+
FORMATO_DATA_ORA_NOMEFILE="%Y-%m-%d_%H-%M-%S"
|
19
|
+
FORMATO_DATA_ORA_NOSPAZI="%Y%m%d%H%M%S"
|
20
|
+
FORMATO_ORA="%H:%M:%S"
|
21
|
+
|
22
|
+
|
23
|
+
@staticmethod
|
24
|
+
def now()->datetime:
|
25
|
+
"""
|
26
|
+
Data e ora attuali.
|
27
|
+
"""
|
28
|
+
return datetime.now()
|
29
|
+
|
30
|
+
@classmethod
|
31
|
+
def nowUtc(cls)->datetime:
|
32
|
+
"""
|
33
|
+
Data e ora attuali in formato UTC (quindi senza fuso orario e DST)
|
34
|
+
"""
|
35
|
+
data=datetime.now(timezone.utc)
|
36
|
+
data=cls.setTimezoneUtc(data)
|
37
|
+
return data
|
38
|
+
|
39
|
+
@staticmethod
|
40
|
+
def today()->date:
|
41
|
+
"""
|
42
|
+
Data odierna, senza ora.
|
43
|
+
"""
|
44
|
+
return date.today()
|
45
|
+
|
46
|
+
@staticmethod
|
47
|
+
def getSecs()->int:
|
48
|
+
"""
|
49
|
+
Timestamp in secondi in formato UTC
|
50
|
+
"""
|
51
|
+
return int(time.time())
|
52
|
+
|
53
|
+
@staticmethod
|
54
|
+
def getMillis()->int:
|
55
|
+
"""
|
56
|
+
Timestamp in millisecondi in formato UTC
|
57
|
+
"""
|
58
|
+
return int(time.time()*1000)
|
59
|
+
|
60
|
+
@classmethod
|
61
|
+
def getWeekDay(cls,data:datetime|None=None)->str:
|
62
|
+
"""
|
63
|
+
Se te lo restituisce in inglese devi settare il locale
|
64
|
+
"""
|
65
|
+
if data is None:
|
66
|
+
data=cls.now()
|
67
|
+
return data.date().strftime("%A")
|
68
|
+
|
69
|
+
#
|
70
|
+
# conversioni
|
71
|
+
#
|
72
|
+
@classmethod
|
73
|
+
def dateToString(cls,data:datetime|None=None,formato:str=FORMATO_DATA_ORA)->str:
|
74
|
+
"""
|
75
|
+
Formatta un oggetto data.
|
76
|
+
:param data: data da formattare, se non specificata viene usata la data attuale
|
77
|
+
:param formato: in che modo deve essere formattata la data, se non specificato viene usato il formato inglese
|
78
|
+
"""
|
79
|
+
if data is None:
|
80
|
+
data=cls.now()
|
81
|
+
return data.strftime(formato)
|
82
|
+
|
83
|
+
@staticmethod
|
84
|
+
def stringToDate(stringa:str,formato:str=FORMATO_DATA_ORA)->datetime:
|
85
|
+
"""
|
86
|
+
Trasforma una data in formato stringa a oggetto.
|
87
|
+
:param stringa: stringa da trasformare in data
|
88
|
+
:param formato: in che modo deve essere formattata la data, se non specificato viene usato il formato inglese
|
89
|
+
"""
|
90
|
+
return datetime.strptime(stringa,formato)
|
91
|
+
|
92
|
+
@staticmethod
|
93
|
+
def timeToString(orario:dt_time,formato:str=FORMATO_ORA)->str:
|
94
|
+
"""
|
95
|
+
Formatta un oggetto di tipo ora.
|
96
|
+
:param orario: orario da formattare
|
97
|
+
:param formato: in che modo deve essere formattato l'orario, se non specificato viene usato il formato standard
|
98
|
+
"""
|
99
|
+
return orario.strftime(formato)
|
100
|
+
@classmethod
|
101
|
+
def stringToTime(cls,stringa:str,formato:str=FORMATO_ORA)->dt_time:
|
102
|
+
"""
|
103
|
+
Formatta un oggetto di tipo ora.
|
104
|
+
:param stringa: stringa da formattare in orario
|
105
|
+
:param formato: in che modo deve essere formattato l'orario, se non specificato viene usato il formato standard
|
106
|
+
"""
|
107
|
+
return cls.dateToTime(cls.stringToDate(stringa,formato))
|
108
|
+
|
109
|
+
@classmethod
|
110
|
+
def timeToDate(cls,orario:dt_time)->datetime:
|
111
|
+
"""
|
112
|
+
Converte da oggetto orario a data completa.
|
113
|
+
Viene aggiunta la data odierna all'orario passato in input.
|
114
|
+
"""
|
115
|
+
return datetime.combine(cls.today(), orario)
|
116
|
+
|
117
|
+
@staticmethod
|
118
|
+
def timedeltaToTime(orario:timedelta)->dt_time:
|
119
|
+
"""
|
120
|
+
Converte un oggetto timedelta a oggetto orario.
|
121
|
+
"""
|
122
|
+
return (datetime.min + orario).time()
|
123
|
+
|
124
|
+
@staticmethod
|
125
|
+
def dateToTime(data:datetime)->dt_time:
|
126
|
+
"""
|
127
|
+
Rimuove la data da un oggetto data completo, lasciando solo l'orario.
|
128
|
+
"""
|
129
|
+
return data.time()
|
130
|
+
|
131
|
+
@staticmethod
|
132
|
+
def dateToTimestamp(data:datetime)->int:
|
133
|
+
"""
|
134
|
+
Converte un oggetto data completo in timestamp in secondi.
|
135
|
+
Se ti serve avere il timestamp in formato UTC usa il metodo dedicato.
|
136
|
+
"""
|
137
|
+
return int(datetime.timestamp(data))
|
138
|
+
@staticmethod
|
139
|
+
def timestampToDate(timestamp:int|float)->datetime:
|
140
|
+
"""
|
141
|
+
Converte un timestamp in secondi in un oggetto data completo.
|
142
|
+
Se ti serve avere il timestamp in formato UTC usa il metodo dedicato.
|
143
|
+
"""
|
144
|
+
return datetime.fromtimestamp(timestamp)
|
145
|
+
|
146
|
+
@classmethod
|
147
|
+
def dateToTimestampUtc(cls,data:datetime)->int:
|
148
|
+
"""
|
149
|
+
Converte un oggetto data completo in timestamp in secondi in formato UTC.
|
150
|
+
"""
|
151
|
+
return cls.dateToTimestamp(cls.setTimezoneUtc(data))
|
152
|
+
@classmethod
|
153
|
+
def timestampUtcToDate(cls,timestamp:int|float)->datetime:
|
154
|
+
"""
|
155
|
+
Converte un timestamp in secondi in formato UTC in un oggetto data completo.
|
156
|
+
Questo metodo richiede python >= 3.11
|
157
|
+
"""
|
158
|
+
return datetime.fromtimestamp(timestamp,UTC)
|
159
|
+
|
160
|
+
#
|
161
|
+
# operazioni
|
162
|
+
#
|
163
|
+
@staticmethod
|
164
|
+
def dateDiff(data1:datetime,data2:datetime)->timedelta:
|
165
|
+
"""
|
166
|
+
Calcola la differenza di tempo (sia data che oraria) tra 2 date complete.
|
167
|
+
"""
|
168
|
+
return data1-data2
|
169
|
+
|
170
|
+
@classmethod
|
171
|
+
def minutesDiff(cls,data1:datetime,data2:datetime)->int:
|
172
|
+
"""
|
173
|
+
Calcola la differenza in minuti tra 2 date complete.
|
174
|
+
"""
|
175
|
+
diff=cls.dateDiff(data1,data2)
|
176
|
+
diffValue=0
|
177
|
+
if diff.days is not None and diff.days!=0:
|
178
|
+
diffValue+=diff.days*24*60
|
179
|
+
diffValue+=int(diff.seconds/60)
|
180
|
+
return diffValue
|
181
|
+
@classmethod
|
182
|
+
def hoursDiff(cls,data1:datetime,data2:datetime)->int:
|
183
|
+
"""
|
184
|
+
Calcola la differenza in ore tra 2 date complete.
|
185
|
+
"""
|
186
|
+
diff=cls.dateDiff(data1, data2)
|
187
|
+
diffValue=0
|
188
|
+
if diff.days is not None and diff.days!=0:
|
189
|
+
diffValue+=diff.days*24
|
190
|
+
diffValue+=int(diff.seconds/3600)
|
191
|
+
return diffValue
|
192
|
+
@classmethod
|
193
|
+
def daysDiff(cls,data1:datetime,data2:datetime) -> int:
|
194
|
+
"""
|
195
|
+
Calcola la differenza in giorni tra 2 date complete.
|
196
|
+
"""
|
197
|
+
diff=cls.dateDiff(data1,data2)
|
198
|
+
if diff.days is not None and diff.days!=0:
|
199
|
+
return diff.days
|
200
|
+
return 0
|
201
|
+
|
202
|
+
@staticmethod
|
203
|
+
def plusMinusDays(data:datetime,days:int|float)->datetime:
|
204
|
+
"""
|
205
|
+
Aggiunge o toglie giorni ad una data completa.
|
206
|
+
"""
|
207
|
+
td=timedelta(days=abs(days))
|
208
|
+
if days>=0:
|
209
|
+
return data + td
|
210
|
+
return data - td
|
211
|
+
|
212
|
+
@staticmethod
|
213
|
+
def plusMinusHours(data:datetime,hours:int|float)->datetime:
|
214
|
+
"""
|
215
|
+
Aggiunge o toglie ore ad una data completa.
|
216
|
+
"""
|
217
|
+
td=timedelta(hours=abs(hours))
|
218
|
+
if hours>=0:
|
219
|
+
return data + td
|
220
|
+
return data - td
|
221
|
+
|
222
|
+
@staticmethod
|
223
|
+
def plusMinusMinutes(data:datetime,minutes:int|float)->datetime:
|
224
|
+
"""
|
225
|
+
Aggiunge o toglie minuti ad una data completa.
|
226
|
+
"""
|
227
|
+
td=timedelta(minutes=abs(minutes))
|
228
|
+
if minutes>=0:
|
229
|
+
return data + td
|
230
|
+
return data - td
|
231
|
+
|
232
|
+
@staticmethod
|
233
|
+
def plusMinusSeconds(data:datetime,seconds:int|float)->datetime:
|
234
|
+
"""
|
235
|
+
Aggiunge o toglie minuti ad una data completa.
|
236
|
+
"""
|
237
|
+
td=timedelta(seconds=abs(seconds))
|
238
|
+
if seconds>=0:
|
239
|
+
return data + td
|
240
|
+
return data - td
|
241
|
+
|
242
|
+
@staticmethod
|
243
|
+
def setStartOfDay(data:datetime)->datetime:
|
244
|
+
"""
|
245
|
+
Imposta l'inizio del giorno ad una data completa.
|
246
|
+
"""
|
247
|
+
return data.replace(hour=0, minute=0, second=0, microsecond=0)
|
248
|
+
|
249
|
+
@staticmethod
|
250
|
+
def setEndOfDay(data:datetime)->datetime:
|
251
|
+
"""
|
252
|
+
Imposta la fine del giorno ad una data completa.
|
253
|
+
"""
|
254
|
+
return data.replace(hour=23, minute=59, second=59, microsecond=999999)
|
255
|
+
|
256
|
+
@classmethod
|
257
|
+
def setTimezoneLocale(cls,data:datetime)->datetime:
|
258
|
+
"""
|
259
|
+
Imposta il fuso orario locale ad una data completa.
|
260
|
+
"""
|
261
|
+
return cls.setTimezoneUtc(data).astimezone(tz=None)
|
262
|
+
|
263
|
+
@classmethod
|
264
|
+
def setTimezoneUtc(cls,data:datetime)->datetime:
|
265
|
+
"""
|
266
|
+
Imposta SOLO il fuso orario UTC ad una data completa.
|
267
|
+
"""
|
268
|
+
return cls.setTimezoneFromTzInfo(data,timezone.utc)
|
269
|
+
|
270
|
+
@staticmethod
|
271
|
+
def setTimezoneFromTzInfo(data:datetime,tz:datetime.tzinfo)->datetime:
|
272
|
+
"""
|
273
|
+
Imposta un fuso orario ad una data completa.
|
274
|
+
"""
|
275
|
+
return data.replace(tzinfo=tz)
|
276
|
+
|
277
|
+
@classmethod
|
278
|
+
def getTimezoneLocal(cls)->datetime.tzinfo:
|
279
|
+
"""
|
280
|
+
Ritorna il fuso orario locale.
|
281
|
+
"""
|
282
|
+
return cls.now().astimezone().tzinfo
|
283
|
+
|
284
|
+
#
|
285
|
+
# altre funzioni
|
286
|
+
#
|
287
|
+
@classmethod
|
288
|
+
def calculateElapsedSecs(cls,millisInizio:int)->str:
|
289
|
+
"""
|
290
|
+
Crea la frase che mostra quanti secondi sono trascorsi dall'inizio.
|
291
|
+
"""
|
292
|
+
elapsedSecs=int((cls.getMillis()-millisInizio)*0.001)
|
293
|
+
if elapsedSecs==0:
|
294
|
+
return ""
|
295
|
+
return f" in {elapsedSecs}s"
|