...
This commit is contained in:
0
herolib/data/__init__.py
Normal file
0
herolib/data/__init__.py
Normal file
0
herolib/data/ourtime/__init__.py
Normal file
0
herolib/data/ourtime/__init__.py
Normal file
BIN
herolib/data/ourtime/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
herolib/data/ourtime/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
0
herolib/data/ourtime/__pycache__/__init__.py
Normal file
0
herolib/data/ourtime/__pycache__/__init__.py
Normal file
BIN
herolib/data/ourtime/__pycache__/ourtime.cpython-313.pyc
Normal file
BIN
herolib/data/ourtime/__pycache__/ourtime.cpython-313.pyc
Normal file
Binary file not shown.
123
herolib/data/ourtime/ourtime.py
Normal file
123
herolib/data/ourtime/ourtime.py
Normal file
@@ -0,0 +1,123 @@
|
||||
from datetime import datetime, timedelta
|
||||
import re
|
||||
|
||||
class OurTime:
|
||||
def __init__(self, dt: datetime = None):
|
||||
self._dt = dt if dt else datetime.min
|
||||
|
||||
def __str__(self) -> str:
|
||||
return self.str()
|
||||
|
||||
def str(self) -> str:
|
||||
if self._dt == datetime.min:
|
||||
return ""
|
||||
return self._dt.strftime('%Y-%m-%d %H:%M')
|
||||
|
||||
def day(self) -> str:
|
||||
if self._dt == datetime.min:
|
||||
return ""
|
||||
return self._dt.strftime('%Y-%m-%d')
|
||||
|
||||
def key(self) -> str:
|
||||
if self._dt == datetime.min:
|
||||
return ""
|
||||
return self._dt.strftime('%Y_%m_%d_%H_%M_%S')
|
||||
|
||||
def md(self) -> str:
|
||||
if self._dt == datetime.min:
|
||||
return ""
|
||||
return self._dt.strftime('%Y-%m-%d %H:%M:%S')
|
||||
|
||||
def unix(self) -> int:
|
||||
if self._dt == datetime.min:
|
||||
return 0
|
||||
return int(self._dt.timestamp())
|
||||
|
||||
def empty(self) -> bool:
|
||||
return self._dt == datetime.min
|
||||
|
||||
def dayhour(self) -> str:
|
||||
if self._dt == datetime.min:
|
||||
return ""
|
||||
return self._dt.strftime('%Y-%m-%d-%H')
|
||||
|
||||
def time(self):
|
||||
# This is a simplified representation, as VLang's time() returns a time object.
|
||||
# Here, we return self to allow chaining format_ss().
|
||||
return self
|
||||
|
||||
def format_ss(self) -> str:
|
||||
if self._dt == datetime.min:
|
||||
return ""
|
||||
return self._dt.strftime('%H:%M:%S')
|
||||
|
||||
def warp(self, expression: str):
|
||||
if self._dt == datetime.min:
|
||||
return
|
||||
|
||||
parts = expression.split()
|
||||
for part in parts:
|
||||
match = re.match(r'([+-]?\d+)([smhdwMQY])', part)
|
||||
if not match:
|
||||
continue
|
||||
|
||||
value = int(match.group(1))
|
||||
unit = match.group(2)
|
||||
|
||||
if unit == 's':
|
||||
self._dt += timedelta(seconds=value)
|
||||
elif unit == 'm':
|
||||
self._dt += timedelta(minutes=value)
|
||||
elif unit == 'h':
|
||||
self._dt += timedelta(hours=value)
|
||||
elif unit == 'd':
|
||||
self._dt += timedelta(days=value)
|
||||
elif unit == 'w':
|
||||
self._dt += timedelta(weeks=value)
|
||||
elif unit == 'M':
|
||||
# Approximate months, for more accuracy, a proper dateutil.relativedelta would be needed
|
||||
self._dt += timedelta(days=value * 30)
|
||||
elif unit == 'Q':
|
||||
self._dt += timedelta(days=value * 90)
|
||||
elif unit == 'Y':
|
||||
self._dt += timedelta(days=value * 365)
|
||||
|
||||
def now() -> OurTime:
|
||||
return OurTime(datetime.now())
|
||||
|
||||
def new(time_str: str) -> OurTime:
|
||||
if not time_str:
|
||||
return OurTime()
|
||||
|
||||
formats = [
|
||||
'%Y-%m-%d %H:%M:%S',
|
||||
'%Y-%m-%d %H:%M',
|
||||
'%Y-%m-%d %H',
|
||||
'%Y-%m-%d',
|
||||
'%d-%m-%Y %H:%M:%S',
|
||||
'%d-%m-%Y %H:%M',
|
||||
'%d-%m-%Y %H',
|
||||
'%d-%m-%Y',
|
||||
'%H:%M:%S', # For time() and format_ss() usage
|
||||
]
|
||||
|
||||
for fmt in formats:
|
||||
try:
|
||||
dt = datetime.strptime(time_str, fmt)
|
||||
return OurTime(dt)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
# Handle relative time expressions
|
||||
try:
|
||||
# Create a dummy OurTime object to use its warp method
|
||||
temp_time = now()
|
||||
temp_time.warp(time_str)
|
||||
return temp_time
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
raise ValueError(f"Could not parse time string: {time_str}")
|
||||
|
||||
def new_from_epoch(epoch: int) -> OurTime:
|
||||
return OurTime(datetime.fromtimestamp(epoch))
|
Reference in New Issue
Block a user