Как проверить, если заданная метка времени находится в секундах или миллисекундах?
Предположим, что данная переменная содержит метку времени UNIX
, но неизвестна ли она в формате секунд или миллисекунд, я хочу назначить переменную, которая находится в формате секунд
Например:
unknown = 1398494489444 # This is millisecond
t = ???
Обновлено: я понимаю, что невозможно сказать, не задавая некоторые ограничения, так что вот оно
- current_ts - 86400 * 365 < неизвестный < current_ts
Assume current_ts = current unix timestamp
Ответы
Ответ 1
Если вы конвертируете максимальные значения временной отметки с цифрами x в миллисекундах, вы получите что-то вроде этого:
- 9999999999999 (13 цифр) означает Сб Ноя 20 2286 17:46:39 UTC
- 999999999999 (12 цифр) означает Sun Sep 09 2001 01:46:39 UTC
- 99999999999 (11 цифр) означает Сб Мар 03 1973 09:46:39 UTC
Могут ли ваши метки времени быть старше 2001 года? Если я не думаю, что вы можете проверить, имеет ли число 13 цифр или более - если да, у вас есть миллисекунды, если у вас нет секунд. Конечно, это будет работать только до тех пор, пока метки времени в секундах не будут иметь 13 цифр, что означает, что отметки времени в миллисекундах будут иметь 16 цифр:
- 1000000000000000 (16 цифр) означает Fri Sep 27 33658 01:46:40, но к тому времени я буду жить на планете из системы Alpha Centauri, и временные стандарты, вероятно, немного изменились:)
P.S. вы можете ослабить условие до 12 цифр или более, если ваши метки времени не могут вернуться назад до 1973. Условие должно быть только до тех пор, пока:
- 100000000000000 (15 цифр) означает Ср Ноя 16 5138 09:46:40
потому что это в секундах будет иметь 12 цифр и будет перекрываться с вашим состоянием
Ответ 2
С риском привлечения нисходящих горизонтов я хочу сделать запись, заявив, что НЕ ДЕЛАЙТЕ ЭТО.
Принятие предположений об единицах физической величины является ужасной идеей - это привело к разрушению метеорологического орбитального аппарата
Но это ОПАСНАЯ вещь.
Тем не менее - если вам нужно это сделать, то в целом я бы рекомендовал следующий подход:
Учитывая все возможные единицы, сделайте преобразование в "разумный" масштаб (например, конвертируйте свою отметку времени в год/месяц/день).
Посмотрите на полученные вами значения. Какой из них "скорее всего". В случае с датами у вас может быть хорошая идея (дата, когда этот компьютер пришел в действие: было ли это 1970 или 2012? И т.д.).
Выберите наиболее вероятное значение
Запишите где-нибудь, что это то, что вы сделали, так что, если последствия этого решения окажутся неправильными, вы можете отслеживать ошибку
Последнее важно - это позволит вам учиться на вашей ошибке. Например, если ваша метка времени сообщает вам о том, когда появится комета, вы можете распечатать
Следующая ожидаемая внешность кометы: 29 декабря 2546 года (предположение: временная метка из X давалась в секундах)
Таким образом, есть некоторые "вернуться". В целом " документировать ваши предположения" - это не просто хороший совет - это важно в любой точной науке.
Наконец - преобразование метки времени от ms к s достигается путем деления числа на 1000. Но я уверен, что вы это знаете.
Ответ 3
С вашими ограничениями тривиально обнаруживать миллисекундные метки времени. Даже отметки времени в прошлом году все еще больше, чем текущая временная метка.
Просто проверьте, больше ли число, чем текущая временная метка; если это так, у вас есть отметка времени в миллисекундах:
now = time.mktime(time.gmtime())
if t > now:
# milliseconds, convert to seconds
t /= 1000.0
Делясь на 1000, вы преобразуете временную метку назад в одну, выраженную в секундах, и можно использовать функции модуля time
по умолчанию.
Это потому, что даже временная метка в миллисекундах, представляющая один год в прошлом, случайно интерпретируемый как метка времени в секундах, легла бы далеко в будущее:
>>> import time
>>> ts = time.mktime(time.gmtime())
>>> year_ago = ts - (86400 * 365)
>>> time.gmtime(year_ago * 1000) # misinterpret milliseconds as seconds
time.struct_time(tm_year=45395, tm_mon=7, tm_mday=9, tm_hour=14, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=190, tm_isdst=0)
Вам нужно будет создать отметку времени в начале 1970 года, прежде чем вы сможете сбить с толку два диапазона:
>>> now = time.mktime(time.gmtime())
>>> time.gmtime(ts / 1000) # misinterpret seconds as milliseconds
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=17, tm_hour=5, tm_min=25, tm_sec=13, tm_wday=5, tm_yday=17, tm_isdst=0)
например. временные метки в течение первых 17 дней после того, как эпоха UNIX может быть запутана для временных меток в миллисекундах. Все после этой даты будет больше, чем временная метка текущего времени.
С вашими конкретными ограничениями вам повезло, что мы можем легко разделить эти два подразделения. Лучший вариант - не попасть в эту ситуацию в первую очередь. Эти данные были получены откуда-то; как можно раньше определить, какой тип данных у вас есть, а не угадывать позже. Система не будет случайным образом давать вам временные метки в секундах в несколько раз, временные метки в миллисекундах в остальное время. Наверняка вы можете узнать на основе другой информации, какой тип данных вы используете и как конвертировать в это время, или аннотировать ваши данные, чтобы включить тип?