Подтвердить что ты не робот

Каков формат временных меток Chrome?

Я использую SQLite Database Browser для чтения информации из базы данных, содержащей историю просмотров для Google Chrome. Мой текущий код, который я выполняю в панели "Выполнение SQL", выглядит следующим образом:

SELECT last_visit_time,url,title
FROM urls
WHERE url LIKE {PLACEHOLDER} AND title LIKE {PLACEHOLDER}

Материал в строке "WHERE" заблокирован с помощью {PLACEHOLDER} для целей конфиденциальности. Теперь я хочу сделать так, чтобы данные, возвращаемые в столбце last_visit_time, были читабельны вместо беспорядочного беспорядка вроде 13029358986442901. Как это сделать и как преобразовать временную метку Chrome в читаемый формат? Как заставить его упорядочить их (возвращенные строки) на last_visit_time?

4b9b3361

Ответ 1

Ответ указан в этом вопросе: "Временная метка [Google Chrome] отформатирована как количество микросекунд с января 1601 года"

Итак, например, в моей тестовой базе данных, запрос

SELECT
  datetime(visit_time / 1000000 + (strftime('%s', '1601-01-01')), 'unixepoch')
FROM visits
ORDER BY visit_time DESC
LIMIT 10;

дает результаты:

2014-09-29 14:22:59
2014-09-29 14:21:57
2014-09-29 14:21:53
2014-09-29 14:21:50
2014-09-29 14:21:32
2014-09-29 14:21:31
2014-09-29 14:16:32
2014-09-29 14:16:29
2014-09-29 14:15:05
2014-09-29 14:15:05

Использование значения временной отметки 13029358986442901:

SELECT
  datetime(13029358986442901 / 1000000 + (strftime('%s', '1601-01-01')), 'unixepoch')

результат:

2013-11-19 18:23:06

Ответ 2

visits.visit_time находится в микросекундах с 1 января 1601 UTC, что похоже, но не ошибочно принимается за время файла Windows, которое составляет 100 наносекунд с 1 января 1601 UTC.

Общая информация: Почему 1601?
Я считаю, что популярный ответ объясняется тем, что григорианский календарь работает на 400-летнем цикле, а 1601 - первый год цикла, который был активен в то время, когда разрабатывалась Windows NT. Другими словами, было выбрано, чтобы математика вышла красиво. 1 января 1601 года - это начало целочисленных дат COBOL. Это также день 1 по формату даты ANSI. И если вы предположите, что в соответствии с ISO8601, который является форматом, в котором он находится, ISO8601 работает еще в 1581 году. До 1583 время было основано на прорептическом григорианском календаре, который имеет 366 дней в году. Возможно, они просто округлились до следующего столетия.


downloads.start_time - количество секунд с 1 января 1970 г. UTC

Общая информация: почему 1970?
Ну, я рад, что вы спросили.. Это было не так. Первоначально это было 1 января 1971 года, но позже округлилось до 1 января 1970 года. 1 января 1970 года считается рождением UNIX.

Стоит отметить, что Firefox форматирует время как количество микросекунд с 1 января 1970 года, а имя для формата - PRTime

Все они представлены в формате ISO 8601 EPOCH.

Ответ 3

Timestap Chromes не является Unixepoch!

Базовое время Chrome 01/01/1601 00:00:00. Чтобы рассчитать местное время, необходимо преобразовать время Chrome в секунды путем деления на миллион, а затем необходимо вычесть разницу в секундах между 01/01/1601 00:00:00 и 01/01/1970 00:00:00., Есть два способа сделать это: сам SQLite и Unix.

SQLITE:

sqlite> SELECT strftime('%s', '1601-01-01 00:00:00');
-11644473600

ДАТА:

$ date +%s -d 'Jan 1 00:00:00 UTC 1601'
-11644473600

В обеих приведенных выше командах "% s" представляет время unixepoch. Команды вычисляют количество секунд между временем unixepoch (1970) и последующей датой (база времени Chrome, 1601). Обратите внимание, что секунды являются отрицательными. Конечно, это потому, что вы должны считать в обратном направлении с 1970 по 1601 год! С помощью этой информации мы можем преобразовать время Chrome в SQLite следующим образом:

sqlite> SELECT datetime((time/1000000)-11644473600, 'unixepoch', 'localtime') AS time FROM table;

Приятного чтения здесь.

Ответ 4

Я новичок в кодировании, поэтому я не уверен, как вы это делаете с sql, однако я могу показать вам метод в С#. Я надеюсь, что это поможет кому-то.

Если значение времени, заданное в базе данных, следующее: 13029358986442901. Выберите только первые 11 цифр 13029358986. Вы можете преобразовать это во времени, используя:

DateTime dateTimeVar = new DateTime(1601,1,1).AddSeconds(time);

Ответ здесь был: 19-11-2013 18:23:06 И это было без преобразования часового пояса.

Ответ 5

Вот компактное выражение для преобразования WebKit Time:

sqlite> SELECT datetime(time/1e6-11644473600,'unixepoch','localtime') AS time FROM table;

Ответ 6

Вы можете вычесть 11644473600000 (1/1/1601 - -11644473600000 в unixepoch) и обработать его как метку времени эпохи регулярного Unix, это предполагает миллисекунды.

милис: 11644473600000 секунд: 11644473600