add 'T' format string conversion (#1646)

to convert 'date'/datetime to timestamp
pull/1677/head
Mike Fährmann 3 years ago
parent f74cf52e2b
commit 0179581340
No known key found for this signature in database
GPG Key ID: 5680CA389D365A88

@ -174,8 +174,7 @@ class Extractor():
elif until: elif until:
if isinstance(until, datetime.datetime): if isinstance(until, datetime.datetime):
# convert to UTC timestamp # convert to UTC timestamp
epoch = datetime.datetime(1970, 1, 1) until = (until - util.EPOCH) / util.SECOND
until = (until - epoch) / datetime.timedelta(0, 1)
else: else:
until = float(until) until = float(until)
seconds = until - now seconds = until - now

@ -145,6 +145,14 @@ def to_string(value):
return str(value) return str(value)
def to_timestamp(dt):
"""Convert naive datetime to UTC timestamp string"""
try:
return str((dt - EPOCH) // SECOND)
except Exception:
return ""
def dump_json(obj, fp=sys.stdout, ensure_ascii=True, indent=4): def dump_json(obj, fp=sys.stdout, ensure_ascii=True, indent=4):
"""Serialize 'obj' as JSON and write it to 'fp'""" """Serialize 'obj' as JSON and write it to 'fp'"""
json.dump( json.dump(
@ -370,6 +378,8 @@ class UniversalNone():
NONE = UniversalNone() NONE = UniversalNone()
EPOCH = datetime.datetime(1970, 1, 1)
SECOND = datetime.timedelta(0, 1)
WINDOWS = (os.name == "nt") WINDOWS = (os.name == "nt")
SENTINEL = object() SENTINEL = object()
SPECIAL_EXTRACTORS = {"oauth", "recursive", "test"} SPECIAL_EXTRACTORS = {"oauth", "recursive", "test"}
@ -536,6 +546,7 @@ class Formatter():
- "d": calls text.parse_timestamp - "d": calls text.parse_timestamp
- "U": calls urllib.parse.unquote - "U": calls urllib.parse.unquote
- "S": calls util.to_string() - "S": calls util.to_string()
- "T": calls util.to_timestamü()
- Example: {f!l} -> "example"; {f!u} -> "EXAMPLE" - Example: {f!l} -> "example"; {f!u} -> "EXAMPLE"
Extra Format Specifiers: Extra Format Specifiers:
@ -566,6 +577,7 @@ class Formatter():
"c": str.capitalize, "c": str.capitalize,
"C": string.capwords, "C": string.capwords,
"t": str.strip, "t": str.strip,
"T": to_timestamp,
"d": text.parse_timestamp, "d": text.parse_timestamp,
"U": urllib.parse.unquote, "U": urllib.parse.unquote,
"S": to_string, "S": to_string,

@ -271,6 +271,7 @@ class TestFormatter(unittest.TestCase):
"s": " \n\r\tSPACE ", "s": " \n\r\tSPACE ",
"u": "%27%3C%20/%20%3E%27", "u": "%27%3C%20/%20%3E%27",
"t": 1262304000, "t": 1262304000,
"dt": datetime.datetime(2010, 1, 1),
"name": "Name", "name": "Name",
"title1": "Title", "title1": "Title",
"title2": "", "title2": "",
@ -295,6 +296,7 @@ class TestFormatter(unittest.TestCase):
self._run_test("{n!S}", "") self._run_test("{n!S}", "")
self._run_test("{t!d}", datetime.datetime(2010, 1, 1)) self._run_test("{t!d}", datetime.datetime(2010, 1, 1))
self._run_test("{t!d:%Y-%m-%d}", "2010-01-01") self._run_test("{t!d:%Y-%m-%d}", "2010-01-01")
self._run_test("{dt!T}", "1262304000")
with self.assertRaises(KeyError): with self.assertRaises(KeyError):
self._run_test("{a!q}", "hello world") self._run_test("{a!q}", "hello world")
@ -601,6 +603,11 @@ class TestOther(unittest.TestCase):
self.assertEqual(f(["a", "b", "c"]), "a, b, c") self.assertEqual(f(["a", "b", "c"]), "a, b, c")
self.assertEqual(f([1, 2, 3]), "1, 2, 3") self.assertEqual(f([1, 2, 3]), "1, 2, 3")
def test_to_timestamp(self, f=util.to_timestamp):
self.assertEqual(f(util.EPOCH), "0")
self.assertEqual(f(datetime.datetime(2010, 1, 1)), "1262304000")
self.assertEqual(f(None), "")
def test_universal_none(self): def test_universal_none(self):
obj = util.NONE obj = util.NONE

Loading…
Cancel
Save