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

вопрос "Datetime к метке времени Unix", но этот вопрос более общий.

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

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

15 ответов


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

date +%s

здесь

  • +%s, секунды с 1970-01-01 00:00: 00 UTC. (GNU Coreutils 8.24 Date manual)

пример вывода теперь 1454000043.


в Ruby:

>> Time.now.to_i
=> 1248933648

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

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

curl icanhazepoch.com

в основном это временные метки unix как служба (UTaaS)


В Perl:

>> time
=> 1335552733

команда "дата" unix удивительно универсальна.

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

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


прежде всего, "эпоха" или нулевое время Unix-1970-01-01 00:00:00Z (что означает полночь 1 января 1970 года в часовом поясе Zulu или 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"'

$ date +%s.%N

где (GNU Coreutils 8.24 Date manual)

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

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


для полноты, PHP:

php -r 'echo time();'

в bash:

clitime=$(php -r 'echo time();')
echo $clitime

В Haskell...

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

import Data.Time.Clock.POSIX
getPOSIXTime

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

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

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;
        }
    }

на Хаскелл

import Data.Time.Clock.POSIX

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

на Go

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

на C

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

С помощью NodeJS просто откройте терминал и введите:
node -e "console.log(new Date().getTime())" или node -e "console.log(Date.now())"


попробуем JavaScript:

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

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

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

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


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

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