Каков формат временных меток 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
?
Ответы
Ответ 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