65 lines
1.4 KiB
Python
65 lines
1.4 KiB
Python
import datetime
|
|
import time
|
|
|
|
|
|
SIZE_TABLE = [
|
|
("b", 1024 ** 0),
|
|
("k", 1024 ** 1),
|
|
("m", 1024 ** 2),
|
|
("g", 1024 ** 3),
|
|
("t", 1024 ** 4),
|
|
]
|
|
|
|
SIZE_UNITS = dict(SIZE_TABLE)
|
|
|
|
|
|
def pretty_size(size):
|
|
for bottom, top in zip(SIZE_TABLE, SIZE_TABLE[1:]):
|
|
if bottom[1] <= size < top[1]:
|
|
suf = bottom[0]
|
|
lim = bottom[1]
|
|
x = round(size / lim, 2)
|
|
if x == int(x):
|
|
x = int(x)
|
|
return str(x) + suf
|
|
return "%s%s" % (size, SIZE_TABLE[0][0])
|
|
|
|
|
|
def parse_size(s):
|
|
try:
|
|
return int(s)
|
|
except ValueError:
|
|
pass
|
|
for i in SIZE_UNITS.keys():
|
|
if s.endswith(i):
|
|
try:
|
|
return int(s[:-1]) * SIZE_UNITS[i]
|
|
except ValueError:
|
|
break
|
|
raise ValueError("Invalid size specification.")
|
|
|
|
|
|
def pretty_duration(secs):
|
|
formatters = [
|
|
(100, "{:.0f}s"),
|
|
(10, "{:2.1f}s"),
|
|
(1, "{:1.2f}s"),
|
|
]
|
|
|
|
for limit, formatter in formatters:
|
|
if secs >= limit:
|
|
return formatter.format(secs)
|
|
# less than 1 sec
|
|
return "{:.0f}ms".format(secs * 1000)
|
|
|
|
|
|
def format_timestamp(s):
|
|
s = time.localtime(s)
|
|
d = datetime.datetime.fromtimestamp(time.mktime(s))
|
|
return d.strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
|
|
def format_timestamp_with_milli(s):
|
|
d = datetime.datetime.fromtimestamp(s)
|
|
return d.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
|