Как я могу генерировать метки времени Unix?


240

Смежный вопрос «Timetime To Unix timestamp» , но этот вопрос носит более общий характер.

Мне нужны метки времени Unix, чтобы решить мой последний вопрос. Мои интересы - это Python, Ruby и Haskell, но приветствуются и другие подходы.

Какой самый простой способ генерировать метки времени Unix?


Я сделал онлайн-инструмент некоторое время назад. quickhash.com/timestamp
AB Carroll

@ABCarroll Можете ли вы объяснить, как ваш онлайн-инструмент предоставляет метки времени Unix? Пожалуйста, приложите к нему руководство и т. Д. Кажется, он предоставляет много данных, но я не могу точно понять, что является целью.
Лео Леопольд Герц 준영

gettimeofdayтакое имя системного вызова POSIX и Linux: stackoverflow.com/questions/11765301/… TODO: почему бы strace date +%dне назвать его?
Сиро Сантилли 郝海东 '病 六四 事件 法轮功

Если вы работаете с временными интервалами и увеличиваете их (например, минуты, дни, часы), я недавно написал инструмент для собственного использования unixtime.ninja
Гай Туре

Ответы:


472

В Linux или MacOS вы можете использовать:

date +%s

где

  • +%s, секунд с 1970-01-01 00:00:00 UTC. (GNU Coreutils 8.24 Дата руководство)

Пример вывода сейчас 1454000043.


1
На Solaris: дата фермы 2> & 1 | grep ^ time | awk '{print $ 3}'
Любомир Млич

Дата BSD поддерживает также +% s. Вероятно, универсальный, как dateобычно определяется в POSIX.2.
Дерексон

@ ĽubomírMlích На хосте SmartOS (SunOS 5.11 joyent_20171026T003127Z) у меня /usr/bin/date +%s and работают оба / usr / xpg4 / bin / date +% s`. В сочетании с рекомендацией POSIX.2, я думаю, что это работает на всех Solaris.
Дерексон

Примечание: добавить 60 секунд: date -v+60S +%sдобавить 1 день: date -v+24H +%sи так далее. , ,
gMale

Как генерировать миллисекунды до 3 цифр?
Парвин Верма

110

в рубине:

>> Time.now.to_i
=> 1248933648

для рельсов вы можете использовать Time.zone.now.to_i. Хотя это даст тот же O / P, Time.now.to)_iно Time.zone.now.to_iэто Railsтак.
свопы

В Rails ./bin/rails runner "p Time.current.to_i"есть еще одно решение.
gipcompany

18

В python добавьте следующие строки, чтобы получить метку времени:

>>> import time
>>> time.time()
1335906993.995389
>>> int(time.time())
1335906993

17

curl icanhazepoch.com

В основном это временные метки Unix как услуга (UTaaS)


3
Хех, мило. Это вдохновило меня на добавление подобной функции на мой хобби-сайт. curl -L -H "Accept: application/json" unixtimesta.mpдаст вам{"datetime":"Thu, 19 Jul 2018 12:01:21 GMT","timestamp":1532001681}
Крейг Андерсон


8

Unix-команда date является на удивление универсальной.

date -j -f "% a% b% d% T% Z% Y" "` date` "" +% s "

Принимает вывод date, который будет в формате, определенном -f, и затем распечатывает его (-j говорит, что не пытайтесь установить дату) в виде +% s, секунд с начала эпохи.


4
date: invalid option -- 'j'
nyuszika7h

1
Это расширение даты GNU, а не в стандарте Unix (POSIX).
июля

8
$ date +%s.%N

где (GNU Coreutils 8.24 Дата руководства)

  • +%s, секунд с 1970-01-01 00:00:00 UTC
  • +%N, наносекунды (000000000..999999999) с начала эпохи

Пример вывода сейчас 1454000043.704350695. Я заметил, что руководство BSD dateне содержит точного объяснения о флаге +%s.


Почему вы включаете наносекунды +$N? Включено ли это в метку времени UNIX в некоторых системах?
Лео Леопольд Герц 준영

2
К вашему сведению, %Nне задокументирована справочная страница для даты в macOS 10.13.1 (High Sierra) и не работает. Образец вывода я получил это: 1523342391.N.
Nishanths

На macOS есть gdateв Homebrew apple.stackexchange.com/a/135749/181223
Фил

7

Прежде всего, «эпоха» Unix или ноль времени - это 1970-01-01 00: 00: 00Z (что означает полночь 1 января 1970 года в часовом поясе Зулу, GMT или UTC). Метка времени Unix - это количество секунд с этого времени, не учитывающее високосных секунд.

Генерация текущего времени в Perl довольно проста:

perl -e 'print time, "\n"'

Генерировать время, соответствующее заданному значению даты / времени, довольно сложно. Логически вы используете strptime()функцию из POSIX. Однако модуль Perl POSIX :: strptime (который отделен от модуля POSIX) имеет сигнатуру:

($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = 
                                     POSIX::strptime("string", "Format");

Функция mktimeв модуле POSIX имеет подпись:

mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)

Итак, если вы знаете формат ваших данных, вы можете написать вариант:

perl -MPOSIX -MPOSIX::strptime -e \
    'print mktime(POSIX::strptime("2009-07-30 04:30", "%Y-%m-%d %H:%M")), "\n"'


3

в Хаскеле

import Data.Time.Clock.POSIX

main :: IO ()
main = print . floor =<< getPOSIXTime

на ходу

import "time"
t := time.Unix()

в С

time(); // in time.h POSIX

// for Windows time.h
#define UNIXTIME(result)   time_t localtime; time(&localtime); struct tm* utctime = gmtime(&localtime); result = mktime(utctime);

в Свифте

NSDate().timeIntervalSince1970 // or Date().timeIntervalSince1970

2

В Хаскеле ...

Чтобы вернуть его как тип POSIXTime:

import Data.Time.Clock.POSIX
getPOSIXTime

Как целое число:

import Data.Time.Clock.POSIX
round `fmap` getPOSIXTime

2
public static Int32 GetTimeStamp()
    {
        try
        {
            Int32 unixTimeStamp;
            DateTime currentTime = DateTime.Now;
            DateTime zuluTime = currentTime.ToUniversalTime();
            DateTime unixEpoch = new DateTime(1970, 1, 1);
            unixTimeStamp = (Int32)(zuluTime.Subtract(unixEpoch)).TotalSeconds;
            return unixTimeStamp;
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
            return 0;
        }
    }

2

Давайте попробуем JavaScript :

var t = Math.floor((new Date().getTime()) / 1000);

... или даже лучше, статический подход:

var t = Math.floor(Date.now() / 1000);

В обоих случаях я делю на, 1000чтобы перейти от секунд до миллис, и я использую Math.floorтолько для представления целых секунд, которые прошли (против округления, которое может округлять до целой секунды, которая еще не прошла).


Это не верно. Оба метода возвращают millisecondsне секунды, а отметка времени unix - это число seconds, прошедшее с 1 января 1970 года в 00:00 UTC. Вы можете использовать JS, просто разделите на 1000 и округлите:Math.round(Date.now()/1000)
Лукас Лиезис

1
@LukasLiesis, должно быть, в этот день был перед кофе, я обновил свой ответ, хотя я выбрал Math.floorвместо Math.round. Приветствия
Madbreaks

0

Если вам нужна временная метка Unix из сценария оболочки (семейство Bourne: sh, ksh, bash, zsh, ...), это должно работать на любой машине Unix в отличие от других предложений (perl, haskell, ruby, python, дата GNU). ), он основан на стандартной команде и функции POSIX.

PATH=`getconf PATH` awk 'BEGIN {srand();print srand()}'

0

В Bash 5 есть новая переменная:

echo $EPOCHSECONDS

Или, если вы хотите более высокую точность (в микросекундах):

echo $EPOCHREALTIME

0

Если я хочу напечатать utc date time с помощью команды date, мне нужно использовать аргумент -u с командой date.

пример

date -u

Вывод

Fri Jun 14 09:00:42 UTC 2019

0

nawk:

$ nawk 'BEGIN{print srand()}'
  • Работает даже на старых версиях Solaris и, возможно, других системах UNIX, где '' 'date +% s' '' не реализована
  • Не работает в Linux и других дистрибутивах, где инструменты posix были заменены версиями GNU (nawk -> gawk и т. Д.)
  • Довольно не интуитивно, но определенно забавно :-)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.