modulitiz-micro 2.34.0__py311-none-any.whl → 2.36.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.
Files changed (105) hide show
  1. modulitiz_micro/ModuloBase64.py +61 -61
  2. modulitiz_micro/ModuloColorText.py +35 -35
  3. modulitiz_micro/ModuloDate.py +295 -295
  4. modulitiz_micro/ModuloFunzioni.py +70 -70
  5. modulitiz_micro/ModuloListe.py +150 -150
  6. modulitiz_micro/ModuloMeteo.py +72 -72
  7. modulitiz_micro/ModuloNumeri.py +130 -130
  8. modulitiz_micro/ModuloPyinstaller.py +29 -29
  9. modulitiz_micro/ModuloSeriale.py +70 -61
  10. modulitiz_micro/ModuloStatistiche.py +31 -31
  11. modulitiz_micro/ModuloStringhe.py +180 -180
  12. modulitiz_micro/ModuloTarghe.py +46 -46
  13. modulitiz_micro/android/ModuloAndroid.py +18 -18
  14. modulitiz_micro/android/ModuloAndroidAdb.py +48 -48
  15. modulitiz_micro/android/ModuloAndroidSim.py +130 -130
  16. modulitiz_micro/android/beans/SmsBean.py +12 -12
  17. modulitiz_micro/android/enums/AndroidSmsTypeEnum.py +17 -17
  18. modulitiz_micro/database/AbstractDatabaseService.py +13 -13
  19. modulitiz_micro/database/AbstractSql.py +69 -69
  20. modulitiz_micro/database/ModuloSqlOracle.py +19 -19
  21. modulitiz_micro/database/ModuloSqlServer.py +43 -43
  22. modulitiz_micro/database/eccezioni/EccezioneDbNoData.py +6 -6
  23. modulitiz_micro/database/mysql/AbstractBasicMysql.py +114 -114
  24. modulitiz_micro/database/mysql/ModuloMysql.py +163 -163
  25. modulitiz_micro/database/mysql/MysqlCommonConverter.py +47 -47
  26. modulitiz_micro/database/mysql/eccezioni/EccezioneMysqlOffline.py +6 -6
  27. modulitiz_micro/database/sqlite/AbstractBasicSQLite.py +114 -114
  28. modulitiz_micro/database/sqlite/ModuloSQLite.py +82 -82
  29. modulitiz_micro/eccezioni/EccezioneBase.py +7 -7
  30. modulitiz_micro/eccezioni/EccezioneCtrlC.py +7 -7
  31. modulitiz_micro/eccezioni/EccezioneRuntime.py +7 -7
  32. modulitiz_micro/eccezioni/EccezioneScheduler.py +7 -7
  33. modulitiz_micro/eccezioni/EccezioneSoNonSupportato.py +7 -7
  34. modulitiz_micro/eccezioni/http/EccezioneHttp.py +8 -8
  35. modulitiz_micro/eccezioni/http/EccezioneHttp404.py +7 -7
  36. modulitiz_micro/eccezioni/http/EccezioneHttpGeneric.py +7 -7
  37. modulitiz_micro/files/ModuloFiles.py +173 -173
  38. modulitiz_micro/files/ModuloLogging.py +69 -69
  39. modulitiz_micro/files/ModuloZip.py +42 -42
  40. modulitiz_micro/files/cache/CacheBean.py +5 -5
  41. modulitiz_micro/files/cache/CacheRam.py +29 -29
  42. modulitiz_micro/files/cache/DatabaseCache.py +91 -91
  43. modulitiz_micro/files/cache/decorators/cacheRam.py +26 -26
  44. modulitiz_micro/files/git/ModuloGit.py +28 -28
  45. modulitiz_micro/files/git/decorators/catchAndRaiseGitExceptions.py +19 -19
  46. modulitiz_micro/files/git/exceptions/EccezioneGit.py +7 -7
  47. modulitiz_micro/gestionedom/GestioneDom.py +44 -44
  48. modulitiz_micro/init/AbstractBasicInit.py +27 -27
  49. modulitiz_micro/init/AbstractInit.py +11 -11
  50. modulitiz_micro/keylogger/EccezioneKeyLogger.py +7 -7
  51. modulitiz_micro/keylogger/ModuloKeylogger.py +73 -73
  52. modulitiz_micro/multithread/ModuloThread.py +26 -26
  53. modulitiz_micro/multithread/ModuloThreadLogger.py +8 -8
  54. modulitiz_micro/multithread/ModuloThreadWithCallbackError.py +25 -25
  55. modulitiz_micro/nlp/ModuloNlp.py +36 -36
  56. modulitiz_micro/nlp/ModuloNlpDateAndTime.py +59 -59
  57. modulitiz_micro/rete/ModuloNetworking.py +67 -67
  58. modulitiz_micro/rete/ModuloOpenVpn.py +15 -15
  59. modulitiz_micro/rete/email/EmailBean.py +5 -5
  60. modulitiz_micro/rete/email/ModuloEmail.py +90 -90
  61. modulitiz_micro/rete/http/ModuloHttp.py +115 -115
  62. modulitiz_micro/rete/http/ModuloHttpConnectionSafe.py +91 -91
  63. modulitiz_micro/rete/http/ModuloHttpUtils.py +69 -69
  64. modulitiz_micro/rete/http/beans/HttpResponseBean.py +5 -5
  65. modulitiz_micro/rete/http/decorators/catchAndRaiseHttpExceptions.py +22 -22
  66. modulitiz_micro/rete/ntp/AbstractModuloNtp.py +73 -73
  67. modulitiz_micro/rete/ntp/ModuloNtpIt.py +8 -8
  68. modulitiz_micro/rete/socketserver/AbstractBasicGetSocketServer.py +35 -35
  69. modulitiz_micro/rete/socketserver/AbstractSocketServer.py +267 -267
  70. modulitiz_micro/rete/ssl/ModuloSsl.py +56 -56
  71. modulitiz_micro/sistema/EnvVarsEnum.py +9 -9
  72. modulitiz_micro/sistema/ModuloEnvVars.py +34 -34
  73. modulitiz_micro/sistema/ModuloSystem.py +298 -298
  74. modulitiz_micro/sistema/ModuloSystemPipe.py +67 -67
  75. modulitiz_micro/social/telegram/AbstractModuloTelegram.py +53 -53
  76. modulitiz_micro/social/telegram/ModuloTelegramSimple.py +26 -26
  77. modulitiz_micro/util/beans/conf/AbstractBasicConfBean.py +11 -11
  78. modulitiz_micro/util/beans/conf/AbstractConfBean.py +16 -16
  79. modulitiz_micro/util/beans/fileconf/AbstractBasicFileConfBean.py +11 -11
  80. modulitiz_micro/util/beans/fileconf/AbstractFileConfBean.py +13 -13
  81. modulitiz_micro/util/beans/globalvar/AbstractBasicGlobalVarBean.py +15 -15
  82. modulitiz_micro/util/beans/globalvar/AbstractGlobalVarBean.py +34 -34
  83. modulitiz_micro/util/decorators/noAwait.py +23 -23
  84. modulitiz_micro/util/pip/AbstractModuloPip.py +41 -41
  85. modulitiz_micro/util/pip/ModuloPip.py +49 -49
  86. modulitiz_micro/util/scheduler/AbstractScheduler.py +32 -32
  87. modulitiz_micro/util/spooler/AbstractSpooler.py +14 -14
  88. modulitiz_micro/util/spooler/Spooler.py +18 -18
  89. modulitiz_micro/util/spooler/beans/QueueBean.py +8 -8
  90. modulitiz_micro/util/spooler/decorators/spooler.py +49 -49
  91. modulitiz_micro/util/spooler/eccezioni/EccezioneSpooler.py +7 -7
  92. modulitiz_micro/util/spooler/eccezioni/EccezioneSpoolerFull.py +7 -7
  93. modulitiz_micro/util/unittesting/AbstractOverrideTestUtil.py +31 -31
  94. modulitiz_micro/util/unittesting/AbstractTestUtil.py +11 -11
  95. modulitiz_micro/util/unittesting/ModuloRunUnitTest.py +25 -25
  96. modulitiz_micro/util/wheel/ModuloBuildWheel.py +117 -117
  97. modulitiz_micro/util/wheel/ModuloCheckTestNamingConvention.py +83 -83
  98. modulitiz_micro/util/wheel/ModuloToml.py +40 -40
  99. modulitiz_micro/util/wheel/ModuloWheel.py +12 -12
  100. {modulitiz_micro-2.34.0.dist-info → modulitiz_micro-2.36.0.dist-info}/LICENSE +21 -21
  101. {modulitiz_micro-2.34.0.dist-info → modulitiz_micro-2.36.0.dist-info}/METADATA +64 -64
  102. modulitiz_micro-2.36.0.dist-info/RECORD +104 -0
  103. modulitiz_micro-2.34.0.dist-info/RECORD +0 -104
  104. {modulitiz_micro-2.34.0.dist-info → modulitiz_micro-2.36.0.dist-info}/WHEEL +0 -0
  105. {modulitiz_micro-2.34.0.dist-info → modulitiz_micro-2.36.0.dist-info}/top_level.txt +0 -0
@@ -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"