Как проверить, если заданная метка времени находится в секундах или миллисекундах?

Предположим, что данная переменная содержит метку времени 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 может быть запутана для временных меток в миллисекундах. Все после этой даты будет больше, чем временная метка текущего времени.

С вашими конкретными ограничениями вам повезло, что мы можем легко разделить эти два подразделения. Лучший вариант - не попасть в эту ситуацию в первую очередь. Эти данные были получены откуда-то; как можно раньше определить, какой тип данных у вас есть, а не угадывать позже. Система не будет случайным образом давать вам временные метки в секундах в несколько раз, временные метки в миллисекундах в остальное время. Наверняка вы можете узнать на основе другой информации, какой тип данных вы используете и как конвертировать в это время, или аннотировать ваши данные, чтобы включить тип?