diff --git a/jc/utils.py b/jc/utils.py index f691d150..0352723e 100644 --- a/jc/utils.py +++ b/jc/utils.py @@ -124,16 +124,45 @@ def parse_datetime_to_timestamp(data): formats = [ {'id': 1, 'format': '%c', 'locale': None}, # C locale format conversion: Tue Mar 23 16:12:11 2021 {'id': 2, 'format': '%a %d %b %Y %I:%M:%S %p %Z', 'locale': None}, # en_US.UTF-8 local format (found in upower cli output): Tue 23 Mar 2021 04:12:11 PM UTC - {'id': 3, 'format': '%A %d %B %Y %I:%M:%S %p %Z', 'locale': None}, # European local format (found in upower cli output): Tuesday 01 October 2019 12:50:41 PM UTC - {'id': 4, 'format': '%a %b %d %I:%M:%S %p %Z %Y', 'locale': None}, # date cli command in en_US.UTF-8 format: Wed Mar 24 06:16:19 PM UTC 2021 - {'id': 5, 'format': '%a %b %d %H:%M:%S %Z %Y', 'locale': None}, # date cli command in C locale format: Wed Mar 24 11:11:30 PDT 2021 - {'id': 6, 'format': '%c', 'locale': ''} # locally configured locale format conversion: Could be anything :) this is a last-gasp attempt + {'id': 3, 'format': '%a %d %b %Y %I:%M:%S %p', 'locale': None}, # en_US.UTF-8 local format with non-UTC tz (found in upower cli output): Tue 23 Mar 2021 04:12:11 PM IST + {'id': 4, 'format': '%A %d %B %Y %I:%M:%S %p %Z', 'locale': None}, # European local format (found in upower cli output): Tuesday 01 October 2019 12:50:41 PM UTC + {'id': 5, 'format': '%A %d %B %Y %I:%M:%S %p', 'locale': None}, # European local format with non-UTC tz (found in upower cli output): Tuesday 01 October 2019 12:50:41 PM IST + {'id': 6, 'format': '%a %b %d %I:%M:%S %p %Z %Y', 'locale': None}, # date cli command in en_US.UTF-8 format: Wed Mar 24 06:16:19 PM UTC 2021 + {'id': 7, 'format': '%a %b %d %H:%M:%S %Z %Y', 'locale': None}, # date cli command in C locale format: Wed Mar 24 11:11:30 PDT 2021 + {'id': 8, 'format': '%c', 'locale': ''} # locally configured locale format conversion: Could be anything :) this is a last-gasp attempt ] + # from https://www.timeanddate.com/time/zones/ + tz_abbr = ['A', 'ACDT', 'ACST', 'ACT', 'ACWST', 'ADT', 'AEDT', 'AEST', 'AET', 'AFT', 'AKDT', 'AKST', 'ALMT', + 'AMST', 'AMT', 'ANAST', 'ANAT', 'AQTT', 'ART', 'AST', 'AT', 'AWDT', 'AWST', 'AZOST', 'AZOT', + 'AZST', 'AZT', 'AoE', 'B', 'BNT', 'BOT', 'BRST', 'BRT', 'BST', 'BTT', 'C', 'CAST', 'CAT', 'CCT', + 'CDT', 'CEST', 'CET', 'CHADT', 'CHAST', 'CHOST', 'CHOT', 'CHUT', 'CIDST', 'CIST', 'CKT', 'CLST', + 'CLT', 'COT', 'CST', 'CT', 'CVT', 'CXT', 'ChST', 'D', 'DAVT', 'DDUT', 'E', 'EASST', 'EAST', + 'EAT', 'ECT', 'EDT', 'EEST', 'EET', 'EGST', 'EGT', 'EST', 'ET', 'F', 'FET', 'FJST', 'FJT', 'FKST', + 'FKT', 'FNT', 'G', 'GALT', 'GAMT', 'GET', 'GFT', 'GILT', 'GMT', 'GST', 'GYT', 'H', 'HDT', 'HKT', + 'HOVST', 'HOVT', 'HST', 'I', 'ICT', 'IDT', 'IOT', 'IRDT', 'IRKST', 'IRKT', 'IRST', 'IST', 'JST', + 'K', 'KGT', 'KOST', 'KRAST', 'KRAT', 'KST', 'KUYT', 'L', 'LHDT', 'LHST', 'LINT', 'M', 'MAGST', + 'MAGT', 'MART', 'MAWT', 'MDT', 'MHT', 'MMT', 'MSD', 'MSK', 'MST', 'MT', 'MUT', 'MVT', 'MYT', 'N', + 'NCT', 'NDT', 'NFDT', 'NFT', 'NOVST', 'NOVT', 'NPT', 'NRT', 'NST', 'NUT', 'NZDT', 'NZST', 'O', + 'OMSST', 'OMST', 'ORAT', 'P', 'PDT', 'PET', 'PETST', 'PETT', 'PGT', 'PHOT', 'PHT', 'PKT', 'PMDT', + 'PMST', 'PONT', 'PST', 'PT', 'PWT', 'PYST', 'PYT', 'Q', 'QYZT', 'R', 'RET', 'ROTT', 'S', 'SAKT', + 'SAMT', 'SAST', 'SBT', 'SCT', 'SGT', 'SRET', 'SRT', 'SST', 'SYOT', 'T', 'TAHT', 'TFT', 'TJT', 'TKT', + 'TLT', 'TMT', 'TOST', 'TOT', 'TRT', 'TVT', 'U', 'ULAST', 'ULAT', 'UYST', 'UYT', 'UZT', 'V', 'VET', + 'VLAST', 'VLAT', 'VOST', 'VUT', 'W', 'WAKT', 'WARST', 'WAST', 'WAT', 'WEST', 'WET', 'WFT', 'WGST', + 'WGT', 'WIB', 'WIT', 'WITA', 'WST', 'WT', 'X', 'Y', 'YAKST', 'YAKT', 'YAPT', 'YEKST', 'YEKT', 'Z'] + + # normalize the timezone by taking out any timezone reference, except UTC + normalized_datetime_list = [] + for term in data.split(): + if term not in tz_abbr: + normalized_datetime_list.append(term) + + normalized_datetime = ' '.join(normalized_datetime_list) + for fmt in formats: try: locale.setlocale(locale.LC_TIME, fmt['locale']) - dt = datetime.strptime(data, fmt['format']) + dt = datetime.strptime(normalized_datetime, fmt['format']) timestamp_naive = int(dt.replace(tzinfo=None).timestamp()) timestamp_obj['format'] = fmt['id'] locale.setlocale(locale.LC_TIME, None)